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

题目


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;
    }
}
posted @ 2022-02-12 00:13  Star_Rising  阅读(120)  评论(0)    收藏  举报