Subarray Product Less Than K

medium array sliding window

Problem

Given an array of positive integers nums and an integer k, return the number of contiguous subarrays whose product is strictly less than k.

Inputnums = [10, 5, 2, 6], k = 100
Output8
[10], [5], [2], [6], [10,5], [5,2], [2,6], [5,2,6] all have product < 100.

def num_subarray_product_less_than_k(nums, k):
    if k <= 1: return 0
    prod, ans, l = 1, 0, 0
    for r, x in enumerate(nums):
        prod *= x
        while prod >= k:
            prod //= nums[l]; l += 1
        ans += r - l + 1
    return ans
function numSubarrayProductLessThanK(nums, k) {
  if (k <= 1) return 0;
  let prod = 1, ans = 0, l = 0;
  for (let r = 0; r < nums.length; r++) {
    prod *= nums[r];
    while (prod >= k) { prod /= nums[l]; l++; }
    ans += r - l + 1;
  }
  return ans;
}
class Solution {
    public int numSubarrayProductLessThanK(int[] nums, int k) {
        if (k <= 1) return 0;
        long prod = 1; int ans = 0, l = 0;
        for (int r = 0; r < nums.length; r++) {
            prod *= nums[r];
            while (prod >= k) { prod /= nums[l]; l++; }
            ans += r - l + 1;
        }
        return ans;
    }
}
int numSubarrayProductLessThanK(vector<int>& nums, int k) {
    if (k <= 1) return 0;
    long prod = 1; int ans = 0, l = 0;
    for (int r = 0; r < (int)nums.size(); r++) {
        prod *= nums[r];
        while (prod >= k) { prod /= nums[l]; l++; }
        ans += r - l + 1;
    }
    return ans;
}
Time: O(n) Space: O(1)