算法挑战39: 乘积小于k的子数组

5 阅读1分钟

题目:

给你一个整数数组 nums 和一个整数 k ,请你返回子数组内所有元素的乘积严格小于 **k 的连续子数组的数目。

思路:

滑动窗口

由于 1 <= nums[i] <= 1000 ,都是正整数, 那么如果 k <= 1, return 0就行了,因为就算只有一个最小的元素1,也不满足 小于 k

如果不满足,就缩小窗口, left++;

直到满足了, 计算以right为右端点的数组,一共有 right - left + 1

然后再扩大窗口, right+1

代码:

var numSubarrayProductLessThanK = function(nums, k) {
    if (k <= 1)return 0;

    let left = 0;
    let n = nums.length;
    let res = 1;
    let ans = 0;
    for(let right = 0; right < n;right++){
        res = res * nums[right];
        while(res >= k && right >= left){
            res = res / nums[left];
            left++;
        }
        ans += right - left + 1;
    }
    return ans;
};