题目链接:leetcode.
确定右边界nums[j]
后,查找满足sum
小于k
的最小的nums[i]
,此时i
到j
之间以nums[j]
为右边界的子数组共有j-i+1
个,更新ans
,j
右移。
k = 0
的样例,使得每个j
都不存在i
,所以while(i <= j && sum >= k)
/*
执行用时:80 ms, 在所有 C++ 提交中击败了66.35%的用户
内存消耗:59.7 MB, 在所有 C++ 提交中击败了91.24%的用户
*/
class Solution {
public:
int numSubarrayProductLessThanK(vector<int>& nums, int k) {
int N = nums.size();
int ans = 0;
int i = 0, j = 0;
int sum = 1;
while(i < N && j < N)
{
sum *= nums[j];
while(i <= j && sum >= k)
{
sum /= nums[i];
i++;
}
ans += j - i + 1;//加上右边界为nums[j]的子数组
j++;
}
return ans;
}
};