Skip to content

Commit b6fd5e4

Browse files
committed
N_209_MinimumSizeSubarraySum
1 parent 5416e54 commit b6fd5e4

File tree

2 files changed

+126
-16
lines changed

2 files changed

+126
-16
lines changed
Lines changed: 75 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,82 @@
11
# 209 - Minimum Size Subarray Sum
22

3+
## 题目
4+
5+
给定一个含有 `n` 个正整数的数组和一个正整数 `s` ,找出该数组中满足其和 `≥s` 的长度最小的连续子数组。如果不存在符合条件的连续子数组,返回 `0`
6+
7+
示例:
8+
9+
```
10+
输入: s = 7, nums = [2,3,1,2,4,3]
11+
输出: 2
12+
解释: 子数组 [4,3] 是该条件下的长度最小的连续子数组。
13+
```
14+
15+
进阶:
16+
17+
如果你已经完成了 `O(n)` 时间复杂度的解法, 请尝试 `O(n log n)` 时间复杂度的解法。
18+
19+
## Solution 1
20+
21+
> 时间复杂度O(n)
22+
23+
定义2个指针 `left``right` 指针:
24+
25+
1. `right` 先右移,直到第一次满足 `sum≥s`
26+
27+
2. `left` 开始右移,直到第一次满足 `sum < s`
28+
29+
重复上面的步骤,直到 right 到达末尾,且 left 到达临界位置,即要么到达边界,要么再往右移动,和就会小于给定值。
30+
331
```
4-
class Solution {
5-
public:
6-
int minSubArrayLen(int s, vector<int>& nums) {
7-
int windowSum = 0, windowStart = 0;
8-
int minWindowSize = numeric_limits<int>::max();
9-
10-
for(int windowEnd=0; windowEnd<nums.size(); windowEnd++) {
11-
windowSum += nums[windowEnd];
12-
13-
while(windowSum >= s) {
14-
minWindowSize = min(minWindowSize, windowEnd-windowStart+1);
15-
windowSum -= nums[windowStart];
16-
windowStart++;
17-
}
32+
public static int solution(int s, int[] nums) {
33+
int left = 0, sum = 0, minLength = Integer.MAX_VALUE;
34+
for (int right = 0; right < nums.length; right++) {
35+
sum += nums[right];
36+
while (sum >= s) {
37+
minLength = Math.min(minLength, right - left + 1);
38+
sum -= nums[left++];
1839
}
40+
}
41+
return minLength == Integer.MAX_VALUE ? 0 : minLength;
42+
}
43+
```
44+
45+
## Solution 2
46+
47+
> 时间复杂度 O(nlogn)
1948
20-
return minWindowSize == numeric_limits<int>::max() ? 0 : minWindowSize;
49+
1. 建立一个比原数组长一位的 `sum` 数组,其中 `sum[i]` 表示 `nums` 数组中 `[0, i - 1]` 的和
50+
51+
2. 对于 `sum` 中每一个值 `sum[i]`,用二分查找法找到子数组的右边界位置,使该子数组之和大于 `sum[i] + s`,然后更新最短长度的距离
52+
53+
```
54+
public static int solution2(int s, int[] nums) {
55+
int[] sum = new int[nums.length];
56+
int minLength = Integer.MAX_VALUE;
57+
if (nums.length != 0) {
58+
sum[0] = nums[0];
59+
}
60+
for (int i = 1; i < nums.length; i++) {
61+
sum[i] = sum[i - 1] + nums[i];
62+
}
63+
for (int i = 0; i < nums.length; i++) {
64+
if (sum[i] >= s) {
65+
minLength = Math.min(minLength, i - binarySearchLastIndexNotBiggerThanTarget(0, i, sum[i] - s, sum));
66+
}
67+
}
68+
return minLength == Integer.MAX_VALUE ? 0 : minLength;
69+
}
70+
71+
static int binarySearchLastIndexNotBiggerThanTarget(int left, int right, int target, int[] sum) {
72+
while (left <= right) {
73+
int mid = (left + right) >> 1;
74+
if (sum[mid] > target) {
75+
right = mid - 1;
76+
} else {
77+
left = mid + 1;
78+
}
2179
}
22-
};
80+
return right;
81+
}
2382
```
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
public class N_209_MinimumSizeSubarraySum {
2+
3+
public static int solution(int s, int[] nums) {
4+
int left = 0, sum = 0, minLength = Integer.MAX_VALUE;
5+
for (int right = 0; right < nums.length; right++) {
6+
sum += nums[right];
7+
while (sum >= s) {
8+
minLength = Math.min(minLength, right - left + 1);
9+
sum -= nums[left++];
10+
}
11+
}
12+
return minLength == Integer.MAX_VALUE ? 0 : minLength;
13+
}
14+
15+
public static int solution2(int s, int[] nums) {
16+
int[] sum = new int[nums.length];
17+
int minLength = Integer.MAX_VALUE;
18+
if (nums.length != 0) {
19+
sum[0] = nums[0];
20+
}
21+
for (int i = 1; i < nums.length; i++) {
22+
sum[i] = sum[i - 1] + nums[i];
23+
}
24+
for (int i = 0; i < nums.length; i++) {
25+
if (sum[i] >= s) {
26+
minLength = Math.min(minLength, i - binarySearchLastIndexNotBiggerThanTarget(0, i, sum[i] - s, sum));
27+
}
28+
}
29+
return minLength == Integer.MAX_VALUE ? 0 : minLength;
30+
}
31+
32+
static int binarySearchLastIndexNotBiggerThanTarget(int left, int right, int target, int[] sum) {
33+
while (left <= right) {
34+
int mid = (left + right) >> 1;
35+
if (sum[mid] > target) {
36+
right = mid - 1;
37+
} else {
38+
left = mid + 1;
39+
}
40+
}
41+
return right;
42+
}
43+
44+
public static void main(String[] args) {
45+
int s = 7;
46+
int[] nums = {2, 3, 1, 2, 4, 3};
47+
System.out.println(solution(s, nums));
48+
System.out.println(solution2(s, nums));
49+
}
50+
51+
}

0 commit comments

Comments
 (0)