问题描述
给定一个正整数数组 nums。
找出该数组内乘积小于 k 的连续的子数组的个数。
示例 1:
输入: nums = [10,5,2,6], k = 100
输出: 8
解释: 8个乘积小于100的子数组分别为: [10], [5],
[2], [6], [10,5], [5,2], [2,6], [5,2,6]。 需要注意的是 [10,5,2]
并不是乘积小于100的子数组。
说明:
- 0 < nums.length <= 50000
- 0 < nums[i] < 1000
- 0 <= k < 10^6
解题报告
一个数组的的子数组个数 为以所有元素开头的子数组个数或者以所有元素结尾的所有子数组个数。
- 移动右指针,更新窗口内的乘积;
- 如果窗口内的乘积大于等于 k,更新左指针,直到窗口内的乘积小于 k;
- 移动右指针,更新窗口内的乘积;
- 只要窗口内的乘积小于 k, 累加
r-l+1
。
实现代码
class Solution {
public:
int numSubarrayProductLessThanK(vector<int>& nums, int k) {
if (k <= 1) return 0;
int ans=0,l=0,r=0,tmpDoc=1;
while(r<nums.size()){
tmpDoc*=nums[r];
while(tmpDoc>=k){
tmpDoc/=nums[l];
l++;
}
ans+=(r-l+1);
r++;
}
return ans;
}
};