問題描述
給定一個正整數數組 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;
}
};