209. Minimum Size Subarray Sum - cocoder39/coco39_LC GitHub Wiki
209. Minimum Size Subarray Sum
int minSubArrayLen(int s, vector<int>& nums) {
int res = 0, sum = 0;
for (int left = 0, right = 0; right < nums.size(); right++) {
sum += nums[right];
if (sum >= s) {
while (sum - nums[left] >= s) {
sum -= nums[left++];
}
if (res == 0 || res > right - left + 1) {
res = right - left + 1;
}
}
}
return res;
}
Solution 2: enumeration + binary search takes advantage of range sum, takes O(n log n) time and O(n) memory.
int minSubArrayLen(int s, vector<int>& nums) {
vector<int> sums(nums.size() + 1);
for (int i = 1; i < sums.size(); i++) {
sums[i] += sums[i - 1] + nums[i - 1];
}
int res = 0;
for (int i = 0; i < sums.size(); i++) {
int start = i, end = sums.size() - 1;
while (start + 1 < end) {
int mid = start + (end - start) / 2;
if (sums[mid] < sums[i] + s) {
start = mid;
}
else {
end = mid;
}
}
if (sums[start] - sums[i] >= s) {
res = res == 0 ? start - i : min(res, start - i);
}
else if (sums[end] - sums[i] >= s) {
res = res == 0 ? end - i : min(res, end - i);
}
}
return res;
}