JZ009:乘积小于k的子数组
📃 题目描述
题目链接:乘积小于k的子数组、剑指offer009
🔔 解题思路
注意:
- 一开始的乘积k值就是小的,随着右边窗口移动才会不断增大
- 怎么样的条件才能更新左窗口:当乘积的值 ≥ k的时候,我们就需要更新左窗口,使得值小于k,出来后的值小于k了,我们才可以更新答案
- 为什么需要left <= right,因为有可能k值为0,写 left <= right 避免k = 0跳不出循环的情况
int numSubarrayProductLessThanK(vector<int>& nums, int k) {
int left = 0, right = 0;
int window = 1, res = 0;//window是乘积结果(注意一开始是1),res是子数组个数值;
for (; right < nums.size(); right++) {
//更新窗口
window *= nums[right];
while (window >= k && left <= right) {
//更新左窗口,更新到值小于k
window /= nums[left];
left++;
}
//更新答案
if(window < k) res += right - left + 1;
}
return res;
}
💥 复杂度分析
- 时间复杂度:o(n)
- 空间复杂度:O(1)