双指针解决连续数组和(乘积)大于等于问题
题目

2.

差异
两题非常相似,差异在于题1求的是符合条件的区间最短长度,而题2求的是符合条件的区间个数。
对于问题1,双指针在滑动过程中。指针r先移动到某个位置,符合条件(不妨设该状态为 状态1),然后移动l指针。在这个过程中,其实已经“隐含”了最短这一条件。因为在状态1下,指针l如果不移动的情况下,移动r指针所寻找到的必然都符合要求,但是都不是最短的,比状态1下的都要长。所以在达到状态1以后,要开始移动l指针。
但对于问题2,统计的时区间个数。在达到状态1(符合条件的状态)后,符合条件的区间个数是(r-l),而不是一个。因为此时移动指针l,必然都符合条件。所以当达到状态1之后,就可以移动指针r。
代码
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int res = Integer.MAX_VALUE, sum = 0;
int l=0, r=0, n=nums.length;
while(l<=r && r<n){
sum += nums[r++];
while(l<=r && sum>=target){
res = Math.min(res, r-l);
sum -= nums[l++];
}
}
return res==Integer.MAX_VALUE ? 0 : res;
}
}
class Solution {
public int numSubarrayProductLessThanK(int[] nums, int k) {
if(k<=1) return 0;
int cnt = 0;
int product = 1;
int l=0, r=0, n=nums.length;
while(l<=r && r<n){
product *= nums[r++];
while(l<=r && product>=k){
product /= nums[l++];
}
cnt += (r-l); // r-l 很关键
}
return cnt;
}
}
浙公网安备 33010602011771号