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:[2,3,1,2,4,3],s = 7Output: 2 Explanation: the subarray[4,3]has the minimal length under the problem constraint.
1 class Solution { 2 public: 3 int minSubArrayLen(int target, vector<int>& nums) { 4 int low = 0; 5 int high = 0; 6 int res = INT_MAX; 7 int sum = 0; 8 while(high < nums.size()) { 9 if (sum <= target) { 10 sum+=nums[high]; 11 high++; 12 } 13 while(sum >= target) { 14 res = min(res,high-low); 15 sum-= nums[low]; 16 low++; 17 } 18 } 19 return res==INT_MAX? 0:res; 20 } 21 };
s = 7, nums = [2,3,1,2,4,3] 2 3 1 2 4 3 ^ l r 上边的窗口内所有数字的和 2 小于 7, r 右移 2 3 1 2 4 3 ^ ^ l r 上边的窗口内所有数字的和 2 + 3 小于 7, r 右移 2 3 1 2 4 3 ^ ^ l r 上边的窗口内所有数字的和 2 + 3 + 1 小于 7, r 右移 2 3 1 2 4 3 ^ ^ l r 上边的窗口内所有数字的和 2 + 3 + 1 + 2 大于等于了 7, 记录此时的长度 min = 4, l 右移 2 3 1 2 4 3 ^ ^ l r 上边的窗口内所有数字的和 3 + 1 + 2 小于 7, r 右移 2 3 1 2 4 3 ^ ^ l r 上边的窗口内所有数字的和 3 + 1 + 2 + 4 大于等于了 7, 更新此时的长度 min = 4, l 右移 2 3 1 2 4 3 ^ ^ l r 上边的窗口内所有数字的和 1 + 2 + 4 大于等于了 7, 更新此时的长度 min = 3, l 右移 2 3 1 2 4 3 ^ ^ l r 上边的窗口内所有数字的和 2 + 4 小于 7, r 右移 2 3 1 2 4 3 ^ ^ l r 上边的窗口内所有数字的和 2 + 4 + 3 大于等于了 7, 更新此时的长度 min = 3, l 右移 2 3 1 2 4 3 ^ ^ l r 上边的窗口内所有数字的和 4 + 3 大于等于了 7, 更新此时的长度 min = 2, l 右移 2 3 1 2 4 3 ^ r l 上边的窗口内所有数字的和 3 小于 7, r 右移,结束
1 class Solution { 2 public int minSubArrayLen(int target, int[] a) { 3 if(a.length==0||a.length==1) 4 return 0; 5 int i = 0,j = 0,sum =0 ,min = Integer.MAX_VALUE; 6 while(j<a.length){ 7 sum+=a[j++]; 8 while(sum>=target){ 9 min = Math.min(min,j-i); 10 sum-=a[i++]; 11 } 12 } 13 return min==Integer.MAX_VALUE?0:min; 14 } 15 16 }