LeetCode 209. Minimum Size Subarray Sum(最小子数组之和)

时间:2022-01-13 04:29:41

原题网址:https://leetcode.com/problems/minimum-size-subarray-sum/

Given an array of n positive integers and a positive integer s, find the minimal length of a subarray of which the sum ≥ s. If there isn't one, return 0 instead.

For example, given the array [2,3,1,2,4,3] and s = 7,
the subarray [4,3] has the minimal length under the problem constraint.

click to show more practice.

More practice:

If you have figured out the O(n) solution, try coding another solution of which the time complexity is O(n log n).

方法一:用二分法尝试各个长度的子数组是否满足条件。

public class Solution {
public int minSubArrayLen(int s, int[] nums) {
if (nums == null || nums.length == 0) return 0;
int i=1, j=nums.length;
boolean found = false;
while (i<=j) {
int m = (i+j)/2;
if (window(s, nums, m)) {
j = m-1;
found = true;
} else {
i=m+1;
}
}
return found ? i : 0;
}
private boolean window(int s, int[] nums, int w) {
int sum = 0;
for(int i=0; i<nums.length; i++) {
if (i>=w) sum -= nums[i-w];
sum += nums[i];
if (sum>=s) return true;
}
return false;
}
}

方法二:使用移动窗口。

public class Solution {
public int minSubArrayLen(int s, int[] nums) {
int min = 0;
int sum = 0;
int from = 0;
for(int i=0; i<nums.length; i++) {
sum += nums[i];
while (sum >= s && from <= i) {
if (min == 0 || i-from+1<min) min = i-from+1;
sum -= nums[from++];
}
}
return min;
}
}