"""
main idea: two pointer + sliding window
iterate through whole array while increment count; until product reached to K, left pointer increment until meet criteria < K to continue next cnt 
note when incrementing left pointer, make sure l <= r, or else l will out of boundry or cnt has repeated count 
"""
class Solution:
    def numSubarrayProductLessThanK(self, nums: List[int], k: int) -> int:
        # time O(N) space O(1)
        if not nums or k <= 1 :return 0
        l  = cnt = 0
        mul = 1
        for r, val in enumerate(nums):
            mul *= val 
            while mul >= k and l <= r:
                mul //= nums[l]
                l += 1
            cnt += r - l + 1
        return cnt