【双指针】s表示前j到i的数字的乘积,当发现乘积大于等于k的时候,就把j向右移动,并且把s除掉个nums[j],这样得到的就是以i结尾的符合要求的数组的最大长度,比这个长度小的以i结尾的也都符合要求,所以每次求完之后把答案加上这个区间长度即可。
class Solution {
public int numSubarrayProductLessThanK(int[] nums, int k) {
int acc = 1, n = nums.length, ans = 0;
for (int i = 0, j = 0; i < n; i++) {
acc *= nums[i];
while (j <= i && acc >= k) acc /= nums[j++];
if (acc < k) {
ans += (i - j + 1);
}
}
return ans;
}
}
class Solution {
public:
int numSubarrayProductLessThanK(vector<int>& nums, int k) {
int s = 1, n = nums.size(), ans = 0;
for (int i = 0, j = 0; i < n; i++) {
s *= nums[i];
while (j <= i && s >= k) s /= nums[j++];
if (s < k) ans += i - j + 1;
}
return ans;
}
};