目录
题目
图片:
题解
target==7
扫描二维码关注公众号,回复:
16504616 查看本文章
left和right刚开始的时候在第一个位置,二者同时指向2,sum==2,length==1
然后,右指针开始移动,left指向2,right指向3,sum==2+3==5,length==2
右指针继续移动,指向1,sum==2+3+1==6,length==3
右指针继续移动,指向2,sum==2+3+1+2==8,length==4
此时符合条件sum>=target,改变minlen的值,minlen=min(minlen,length);
每一次遇到sum>=target的情况,left指针向右移动一位,开始一次新的查找。
这时,left指向3,right指向2sum==3+1+2==6,length==3
右指针继续向右移动一位,sum==3+1+2+4==10,length==4
这时,满足sum>=target,minlen==4
左指针向右移动一位,sum==1+2+4==7,length==3
此时满足sum>=target的条件,minlen==3
左指针向右移动一位,sum==2+4==6,length==2
右指针向右移动一位,sum==2+4+3==9,length==3
左指针向右移动一位,sum==4+3==7,length==2
满足条件,minlen==2
左指针继续向右移动一位,sum==3,不符合条件,左右指针到头了,查找结束,指针不再移动
返回所记录的最小长度minlen。
等等,以此类推……
代码
class Solution {
public int minSubArrayLen(int target, int[] nums) {
if (nums.length==0){
return 0;
}
/*如果数组的长度为0,数组中没有元素,那么就不可能找到符合条件的子数组,就返回0*/
int sum = 0;
int left = 0;
int minlen = Integer.MAX_VALUE;
for (int right = 0; right < nums.length; right++) {
/*左右指针,用右指针作为for循环进行移动*/
sum+=nums[right];
while (sum>=target){//如果符合条件,就移动左指针
minlen=Math.min(minlen,right-left+1);
sum-=nums[left];//移动左指针之前要减去sum中原先左指针指向的数值
left++;
}
}
return minlen==Integer.MAX_VALUE?0:minlen;//如果数组中始终没有满足条件的子数组,就返回0
}
}