leetcode209长度最小的子数组

leetcode209长度最小的子数组

二月 21, 2020

209 长度最小的子数组

前言:本篇文章是我自己解题的思路,二分查找法并没有看懂,只有一般的滑动窗口法。

滑动窗口要找出左边界和右边界变化的条件。个人理解:左边界变化的条件是max,也就是窗口内部数字的和大于等于s的时候。右边界变化的条件是小于s。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public int minSubArrayLen(int s, int[] nums) {
int max=0,result=Integer.MAX_VALUE,i=0,j=0;
while(j<nums.length) {
max=sumArray(nums,i,j);
if(max>=s) {
result=Math.min(result, j-i+1);
i++;
}else {
j++;
}
}
if(result==Integer.MAX_VALUE)return 0;
return result;
}
public int sumArray(int[]num,int start,int end) {
int sum=0;
for(int i=start;i<=end;i++) {
sum+=num[i];
}
return sum;
}

这么写很慢,用了89ms,题解给出了一种方式,可以在求和数组的方法上面优化一下。用一个数储存,每次变化的时候不用重新求和。
更改之后:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public int minSubArrayLen(int s, int[] nums) {
int max=0,result=Integer.MAX_VALUE,i=0,j=0;
if(nums.length==0)return 0;
max+=nums[0];
while(j<nums.length) {
if(max>=s) {
result=Math.min(result, j-i+1);
max=max-nums[i];
i++;
}else {
j++;
if(j<nums.length)
max+=nums[j];
}
}
if(result==Integer.MAX_VALUE)return 0;
return result;
}

这个结果是2ms,鉴于二分法和我的思路查的有点多,也没看懂,所以这道题就先这样吧。leetcode 3/100