Problem
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.
Solution
维护一个窗口,该窗口尽量使得内部的元素之和大于等于 S,
这样如果小于 s , 就移动又窗口,
否则就移动左窗口
class Solution {
public:
int minSubArrayLen(int s, vector<int>& nums) {
if(nums.empty() || s < 0) return 0;
const int N = nums.size();
int rst = INT_MAX, curSum = 0;
for( int left = 0, right = 0; right <= N; ){
if( curSum < s){
if(right == N) break;
curSum += nums[right++];
}
else {
rst = min( rst, right - left);
curSum -= nums[left++];
}
}
return rst==INT_MAX ? 0 : rst;
}
};
Bug : right <
= nums.size() 是停止条件
Solution 2
因为全部都是正数,可以累加起来,然后用二分查找。