暴力超时:
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int len=nums.length;
int min=Integer.MAX_VALUE;
for(int i=0;i<len;i++){
int sum=0;
for(int j=i;j<len;j++){
sum+=nums[j];
if(sum>=target){
if(j-i+1<min){
min=j-i+1;
}
break;
}
}
}
if(min==Integer.MAX_VALUE)
min=0;
return min;
}
}
滑动窗口错误代码:
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int len=nums.length;
int min=Integer.MAX_VALUE;
int left=0,right=0;
int sum=0;
while(right<len){
sum+=nums[right++];
if(sum>=target){
min=Math.min(min,right-left+1);
sum-=nums[left++];
}
}
return min==Integer.MAX_VALUE?0:min;
}
}
这里错在每次判断sun>target之后left++;但是right=len-1的时候循环就结束了,left没有取到最后len-1的情况,距len-1还有第一次得出sum>target时left与right得距离,所以外面循环条件需要改成left<len终止循环
滑动窗口错误代码:
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int len=nums.length;
int min=Integer.MAX_VALUE;
int left=0,right=0;
int sum=0;
while(left<len){
if(sum>=target){
min=Math.min(min,right-left+1);
sum-=nums[left++];
}
else if(right==len-1){
sum-=nums[left++];
}
else
sum+=nums[right++];
}
return min==Integer.MAX_VALUE?0:min;
}
}
这里存在两个错误, min=Math.min(min,right-left+1)中不该+1,因为我在sum+nums[right]的时候right++,这里+1会导致结果变大;另外也是因为每次right++,right=len-1时sum还没有+nums[len-1],导致错判结果相当于nums数组最后一位被去掉了; 通过代码:
public int minSubArrayLen(int target, int[] nums) {
int len=nums.length;
int min=Integer.MAX_VALUE;
int left=0,right=0;
int sum=0;
while(left<len){
if(sum>=target){
min=Math.min(min,right-left);
sum-=nums[left++];
}
else if(right==len){
sum-=nums[left++];
}
else
sum+=nums[right++];
}
return min==Integer.MAX_VALUE?0:min;
}
}