原题链接在这里:https://leetcode.com/problems/minimum-size-subarray-sum/
维护一个window, 当sum<s时一直移动window 的 right index, 同时更新sum.
当sum >= s后一直移动window left index, 同时更新sum 和 res.
最后返回时看res 是否 被更新过,若被更新过就返回 res, 没有更新过说明没有符合要求的window, 返回0.
Note: right的初始值是0, 所以每次更新sum 后 right 是指向了下个没有加进sum里的数值. 外循环while中的第二部分检测sum 是否 >=0 时必须使用while 循环而不是if.
e.g. [1,2,3,4,5] s = 11. 当第一次出现sum > s时 sum = 15, right = 5, 如果下面使用if 的话,只会更新一次res = 5 就会跳出外循环while, 应为此时right= 5已经不满足 外魂环while loop, right < nums.length的条件了。
AC Java:
1 public class Solution { 2 public int minSubArrayLen(int s, int[] nums) { 3 if(nums == null || nums.length == 0){ 4 return 0; 5 } 6 int res = Integer.MAX_VALUE; 7 int left = 0; 8 int right = 0; 9 int sum = 0; 10 while(left < nums.length && right < nums.length){ 11 while(right < nums.length && sum < s){ 12 sum+=nums[right]; 13 right++; 14 } 15 while(sum >= s){ 16 res = Math.min(res, right-left); 17 sum -= nums[left]; 18 left++; 19 } 20 } 21 return res == Integer.MAX_VALUE ? 0 : res; 22 } 23 }
LeetCode Minimum Size Subarray Sum
原文:http://www.cnblogs.com/Dylan-Java-NYC/p/4868734.html