解析
两种解法,双指针,和二分查找
代码
双指针
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;
}
京公网安备 11010502036488号