209. 长度最小的子数组

滑动窗口:

class Solution {
    public int minSubArrayLen(int target, int[] nums) {
         int i=0;
         int j=0;
         int sum=0;
         int min=Integer.MAX_VALUE;
         while(j<nums.length){
             sum+=nums[j];
             if(sum<target){
                 j++;
             }else{
                min=Math.min(min,j-i+1);
                sum-=nums[i];
                i++;
                sum-=nums[j];
             }
         }
         return (min==Integer.MAX_VALUE)?0:min;

    }
}

二分查找:

class Solution {
    //2,5,6,8,12,15
    public int minSubArrayLen(int target, int[] nums) {
        
        int min=Integer.MAX_VALUE;
        int[] number=new int[nums.length+1];
        for(int i=1;i<number.length;i++){//前缀和的题目加入一个0非常关键
       number[i]=nums[i-1];
        }
        for(int i=1;i<number.length;i++){
             number[i]+=number[i-1];
             //在0..i-1找前缀和之差》=target(最后一个满足这个的下标)
             int lo=0;
             int hi=i;
             while(lo<hi){
                 int mid=lo+(hi-lo)/2;//中间偏右
                 if(number[i]-number[mid]<target)//[hi,n)是不满足条件的
                     hi=mid;//mid给右边
                 else//mid给右边,[0,lo)是满足条件的
                     lo=mid+1;          
             }
             if(lo-1>=0&&number[i]-number[lo-1]>=target)
                 min=Math.min(min,i-lo+1);
        }
        if(min==Integer.MAX_VALUE)return 0;
        return min;

    }
}
posted @ 2021-08-07 20:35  wsshub  阅读(33)  评论(0)    收藏  举报