iven 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.
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).
O(n)的做法就是sliding window
public class Solution {
public int minSubArrayLen(int s, int[] nums) {
int min = Integer.MAX_VALUE;
int curSum =0, start = 0, end = 0;
while (end < nums.length) {
curSum += nums[end];
while (curSum >= s) {
min = Math.min(end-start+1, min);
curSum -= nums[start++];
}
end++;
}
return min == Integer.MAX_VALUE ? 0 : min;
}
}
nlogn的做法:https://leetcode.com/discuss/35417/c-solution-both-o-n-%26-o-nlogn
思路就是记录每个位置上到当前位置前面的和:sum[i] 为0->i-1的所有数字和,如果sum[i]>= 目标数字,就2分查找比sum[i]-target+1小且是最大的数字。如果找到,index=j那么j到i-1就是这个subarray, length=i-1-j+1=i-j
public class Solution {
public int minSubArrayLen(int s, int[] nums) {
int min = Integer.MAX_VALUE;
int[] sum = new int[nums.length+1];
for (int i = 0; i < nums.length; i++) {
sum[i+1] = sum[i] + nums[i];
if (sum[i+1] >= s) {
int j = binarySearch(0, i, sum[i+1]-s+1, sum);
if (j > -1) {
min = Math.min(min, i-j+1);
}
}
}
return min == Integer.MAX_VALUE ? 0 : min;
}
int binarySearch(int left, int right, int target, int[] sum) {
int result = -1;
while (left < right-1) {
int m = left + (right-left)/2;
if (sum[m] >= target) {
right = m-1;
} else if (sum[m] < target) {
left = m;
}
}
if (sum[right] < target) {
return right;
} else if (sum[left] < target) {
return left;
} else {
return -1;
}
}
}