题目:
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.
/*维护一个闭区间[first, last],如果区间和大于等于s,那么++first, 否则++last*/
class Solution {
public:
int minSubArrayLen(int s, vector<int>& nums) {
if (nums.empty())
{
return 0;
}
//first指向子数组第一个元素,last指向数组最后一个元素
int first = 0, last = 0, sum = nums[0];//sum表示区间[first, last]中的元素的和
int minLen = nums.size();
int len = 1;
bool isOver = false;//有没有超过s
while (last < nums.size() || sum >= s)
{
if (sum < s)
{
++last;
if (last >= nums.size())//sum < s没法移动first,last已经到达最后不能移动last,那么返回咯
{
break;
}
++len;//向后扩充区间
sum += nums[last];
}
else
{
isOver = true;
minLen = min(minLen, len);
sum -= nums[first];
++first;
--len;
}
}
if (isOver)
{
return minLen;
}
else
{
return 0;
}
}
};