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.
Classical two pointers problem.
#include <vector>
#include <iostream>
#include <limits>
using namespace std;
int minSubArrayLen(int target, vector<int>& nums) {
int minLen = nums.size() + 1; // basically any number wont reach is fine. Usually use INT_MAX
int sum = 0;
int i = 0, j = 0; // two pointers. One keep tracking the low scope, one tracking the high scope.
while(i < nums.size()) {
sum = sum + nums[i];
while(sum >= target) {
minLen = min(minLen, i - j + 1);
sum = sum - nums[j];
j++;
}
i++;
}
return minLen == nums.size() + 1 ? 0 : minLen;
}
int main(void) {
vector<int> nums {7};
int len = minSubArrayLen(7, nums);
cout << len << endl;
}