题目:
给你一个整数数组 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;
};