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 = 7
Output: 2 Explanation: the subarray[4,3]
has the minimal length under the problem constraint.
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 右移,结束
class Solution { public: int minSubArrayLen(int s, vector<int>& a) { int slow = 0; int min_res = INT_MAX; int n = a.size(); int sum ; for (int i = 0; i < n; i++) { sum += a[i]; while(sum >= s) { min_res = std::min(min_res,i+1-slow); sum-=a[slow++]; } } return (min_res != INT_MAX) ? min_res : 0; } };
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 }