leetcode 209 Minimum Size Subarray Sum


  1. Minimum Size Subarray Sum:题目链接

方法1:暴力解法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class Solution1 {
// 暴力破解 时间复杂度O(N^2) 空间复杂度O(1)
public int minSubArrayLen(int s, int[] nums) {
int res = Integer.MAX_VALUE;
for (int i = 0; i < nums.length; ++i) {
int sum = 0;
for (int j = i; j < nums.length; ++j) {
sum += nums[j];
if (sum >= s) {
res = Math.min(j - i + 1, res);
}
}
}
return res == Integer.MAX_VALUE? 0 : res;
}

public static void main(String[] args) {
int[] nums = {2, 3, 1, 2, 4, 3};
int s = 7;
System.out.println(new Solution1().minSubArrayLen(s, nums));
}
}

方法2:双指针之滑动窗口

基本思想:维护一个区间[left,right),使得在这个区间里的和是小于s的,如果加上一个数之后区间和大于等于s了,那么就从区间左边开始删元素,并且边删边判断是不是和依然大于等于s,更新结果.

原理

如果sum >= s,记录当前长度即right-left,然后删除[left,right)最左侧元素,left向右移,即sum -=nums[left++],直到sum < s

sum >= s

原理

sum < s

原理
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class Solution2 {
// 时间复杂度O(N) 空间复杂度O(1) 双指针之滑动窗口
public int minSubArrayLen(int s, int[] nums) {
int left = 0, right = 0; // [left, right) 左闭右开区间
int sum = 0;
int res = Integer.MAX_VALUE;

while (right < nums.length) {
sum += nums[right++];
while (sum >= s){
res = Math.min(right - left, res);
sum -= nums[left++];
}
}
return res == Integer.MAX_VALUE ? 0 : res;
}

public static void main(String[] args) {
int[] nums = {2, 3, 1, 2, 4, 3};
int s = 7;
System.out.println(new Solution2().minSubArrayLen(s, nums));
}
}

pS: 源代码链接

文章目录
  1. 1. 方法1:暴力解法
  2. 2. 方法2:双指针之滑动窗口
|