解析
两种解法,双指针,和二分查找
代码
双指针
public int minSubArrayLen(int s, int[] nums) { if(nums.length==0) return 0; int min=Integer.MAX_VALUE; int left=0; int right=0; int sum=nums[0]; while(right<nums.length) { if(sum<s) { right++; if(right>=nums.length) return min==Integer.MAX_VALUE?0:min; sum+=nums[right]; }else if(sum>=s) { min=Math.min(min,right-left+1); sum-=nums[left]; left++; } } return 0; }
二分查找
public int minSubArrayLen(int s, int[] nums) { if(nums.length==0) return 0; int min=Integer.MAX_VALUE; int[] sums=new int[nums.length]; sums[0]=nums[0]; for(int i=1;i<sums.length;i++) { sums[i]=sums[i-1]+nums[i]; } for(int i=0;i<nums.length-1;i++) { if(nums[i]>=s) return 1; int val=s+sums[i]-nums[i]; int start=i+1; int end=sums.length-1; int res=Integer.MAX_VALUE; while(start<=end) { int mid=(start+end)/2; if(sums[mid]>=val) { res=mid; end=mid-1; }else { start=mid+1; } } if(res!=Integer.MAX_VALUE) min=Math.min(min,res-i+1); } return min==Integer.MAX_VALUE?0:min; }