"""
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