209. Minimum Size Subarray Sum

Medium
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.

这道题看的答案,连暴力法也没有自主想出来。一开始让左右指针都为0, sum = nums[0], minLen = Integer.MAX_VALUE.当sum >= s时,说明现在的subArray的和过大,不一定是最短的满足sum >= s的子数组。此时就更新一下minLen, 然后删掉现在的subArray的第一个元素,也就是最靠左的元素,让left index递增,去寻找是否有更短的subArray的可能; 如果sum < s, 则向右移动right指针,sum += nums[right], 继续进行whiile循环。但是如果此时right已经达到最右,则需要注意这个时候已经不能再继续增加sum。 检查此时的minLen, 如果还是初始值,说明整个过程中我们都没有遇到sum >= s的情况,如果不是初始值了,说明遇到过sum >= s的情况,而我们在删掉left,右移left pointer的时候sum变小,变得sum < s了,这个时候我们直接返回记录到的minLen就好了。

class Solution {
    public int minSubArrayLen(int s, int[] nums) {
        if (nums == null || nums.length == 0){
            return 0;
        }
        int l = 0;
        int r = 0;
        int sum = nums[0];
        int minLen = Integer.MAX_VALUE;
        while (r < nums.length){
            if (sum >= s){
                minLen = Math.min(minLen, r - l + 1);
                sum -= nums[l];
                l++;
            } else {
                if (r == nums.length - 1){
                    if (minLen == Integer.MAX_VALUE){
                        minLen = 0;
                    } 
                    break;
                }
                r++;
                sum += nums[r];
            }
        }
        return minLen;
    }
}

你可能感兴趣的:(209. Minimum Size Subarray Sum)