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;
}
}