209. Minimum Size Subarray Sum

来源:互联网 发布:初学数控车床编程教程 编辑:程序博客网 时间:2024/06/05 11:37

Given an array of n positive integers and a positive integer s, find the minimal length of a 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.

思路:前后指针的移动窗口问题,各种corner case要考虑全面

public class Solution {    //前后指针的移动窗口,当sum>=s时更新最小len    public int minSubArrayLen(int s, int[] nums) {        if(nums==null||nums.length==0) return 0;        int len=nums.length+1;        //sum从nums[0]开始,保持tail在当前sum的尾        for(int head=0,tail=0,sum=nums[0]; tail<nums.length & head<=tail; ){            if(sum<s) {                //先tail++,再sum+=nums[tail],让tail在当前sum的尾,下一轮算len不会多1                tail++;                 //11, [1,2,3,4,5]array outofrange error 判断一下tail==nums.length再sum+=nums[tail], 防止tail已经是最后一个了                if(tail<nums.length) sum+=nums[tail];            }            else{                len = Math.min(len,tail-head+1);                 sum-=nums[head];                 head++;            }        }        return len>nums.length? 0:len;    }}

更清晰的思路

    public int minSubArrayLen(int s, int[] nums) {        if(nums==null||nums.length==0) return 0;        int minL=nums.length+1, sum=0;        for(int pre=0, cur=0; cur<nums.length&&pre<=cur; ){            sum+=nums[cur++];            while(sum>=s){                minL = Math.min(minL,cur-pre);                sum-=nums[pre++];            }        }        return minL>nums.length?0:minL;    }


0 0
原创粉丝点击