二刷209.Minimum Size Subarray Sum

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 -1 instead.

Have you met this question in a real interview? Yes

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.

Challenge If you have figured out the O(n) solution, try coding another solution of which the time complexity is O(n log n).

这道题是Two Pointers的题目,解法很有套路。一开始我们有两个指针l , r = 0. 然后判断sum. 如果sum < s, 则sum += nums[r], 同时r右移。 这样当sum >= s的时候,我们需要更新minLen = Math.min(minLen, r - l). (这里注意不是r - l + 1,因为每次我们加上nums[r]之后,都会右移r, 所以每次加起来的和满足sum >=s的时候,r指针已经跳到下一步去了,r指针指的是当前求的和所包括的所有元素的更往右一个,所以len刚好等于 r - l.). 同时,只要找到一个满足s um >= s的subarray, 我们就不可能傻到还要继续右移r pointer了对不对,这时候再怎么右移,只有可能让len更大,而我们要求的是Minium size subArray. 所以我们不会继续右移r, 而是要右移动l, 去看看还有没有可能有更短的subArray了。 当我们右移l的时候,要同时sum -= nums[i], 再继续循环。

最后我们可能遇到r == nums.length的情况,退出了while loop.但此时还有可能有更短的subArray我们没有找到。这时候我们只需要继续右移l pointer,看有没有可能找到满足len更小,sum >= s的情况,于是我们的while loop的判断条件是while (sum >= s). 一个一个地减去nums[i],并且i++, 不断更新minLen = Math.min(minLen, r - l),直至退出循环。此时我们的minLen才是最短的满足条件的subArray的长度。

二刷209.Minimum Size Subarray Sum_第1张图片
Screen Shot 2017-09-27 at 10.35.52 PM.png
public class Solution {
    /*
     * @param nums: an array of integers
     * @param s: An integer
     * @return: an integer representing the minimum size of subarray
     */
    public int minimumSize(int[] nums, int s) {
        // write your code here
        if (nums == null || nums.length == 0){
            return -1;
        }
        int minLen = Integer.MAX_VALUE;
        int l = 0;
        int r = 0;
        int sum = 0;
        while (r < nums.length){
            if (sum < s){
                sum += nums[r];
                r++;
            } else {
                minLen = Math.min(minLen, r - l);
                if (r == l + 1){
                    return 1;
                }
                sum -= nums[l++];
            }
        }
        while (sum >= s){
            minLen = Math.min(minLen, r - l);
            sum -= nums[l++];
        }
        return minLen == Integer.MAX_VALUE ? -1 : minLen;
    }
}

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