Problem statement:
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.
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:
It looks like 53. Maximum Subarray. But they are different solutions. I solve this problem by two pointers, left and right. The return value is the min length which is greater than or equal to the target. I can control the movement of these two pointers to update the min length.
Basic idea:
- If sum >= target, left moves to the end and minus the value of left, meanwhile update the min length.
- One terminating condition is left > right, that means we already find the min length is 1 and return. Otherwise, I find until the end.
- If sum < target, right moves to the end and plus the value of right.
Since left and right move at most n steps. Time complexity is O(2 * n) ---> O(n).
class Solution { public: int minSubArrayLen(int s, vector<int>& nums) { if(nums.empty()){ return 0; } int left = 0; int right = 0; int sum = nums[left]; int len = INT_MAX; while(left <= right && left < nums.size() && right < nums.size()){ // if current sum is a solution if(sum >= s){ // update the len len = min(len, right - left + 1); // update the sum // minus first and move left towards end sum -= nums[left++]; } else { // the sum is still less than target // move right to the end and update the sum sum += nums[++right]; } } // return 0 if no answer return len == INT_MAX ? 0 : len; } };