209. Minimum Size Subarray Sum**

​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 contiguous subarray of which the ​​sum ≥ s​​​. If there isn’t one, return ​​0​​ instead.

Example:

Input: s = 7, nums = [2,3,1,2,4,3]
Output: 2
Explanation: the subarray [4,3] has the minimal length under the problem constraint.

Follow up:
If you have figured out the 209. Minimum Size Subarray Sum**_c++ solution, try coding another solution of which the time complexity is 209. Minimum Size Subarray Sum**_c++_02.

C++ 实现 1

双指针. 查找 ​​nums[i ... j)​​​ 之和 209. Minimum Size Subarray Sum**_双指针_03. 我下面的代码有点魔幻~.

class Solution {
public:
int minSubArrayLen(int s, vector<int>& nums) {
int i = 0, j = 0, res = nums.size() + 1;
int sum = 0;
while (i < nums.size() && j < nums.size()) {
while (j < nums.size() && sum < s) sum += nums[j++];
while (sum >= s) {
res = std::min(res, j - i);
sum -= nums[i++];
}
}
return (res == nums.size() + 1) ? 0 : res;
}
};

C++ 实现 2

来自 LeetCode Submission. 这个代码可能更符合常规.

class Solution {
public:
int minSubArrayLen(int s, vector<int>& nums) {
int start = 0;
int minLength = INT_MAX;
int currSum = 0;
for(int i = 0; i < nums.size(); ++i) {
currSum += nums[i];
if(currSum >= s) {
while(currSum >= s) {
minLength = min(minLength, i-start+1);
currSum -= nums[start];
start++;
}
}
}
if(minLength == INT_MAX)
return 0;

return minLength;
}
};