209. Minimum Size Subarray Sum

209. 长度最小的子数组

Posted by bbkgl on June 29, 2020

落花人独立

微雨燕双飞

双指针,也可以说是滑动窗口。

双指针比较难理解的地方在于,怎么确定这两个下标移动的时候不会漏掉可能最优的情况。

一般来说对于有序数组,我们要找到某个和,可以用双指针中的左右指针。同样这次也是要找某个满足条件的和,所以首先就是要构造前缀和数组,这样直接就能根据差确定某段连续元素的和。

然后就是用双指针维护一个最小的窗口,如果前缀和的差小于S,则需要扩大窗口,右移right。

如果前缀和的差大于等于S,则需要缩小窗口,右移left。

class Solution {
public:
    int minSubArrayLen(int s, vector<int>& nums) {
        int len = nums.size();
        vector<int> presum(len + 1, 0);
        for (int i = 1; i <= len; i++) presum[i] = presum[i - 1] + nums[i - 1];
        int left = 0, right = 1;
        int ans = INT_MAX;
        while (right <= len) {
            if (presum[right] - presum[left] >= s) {
                ans = min(ans, right - left);
                left++;
            } else right++;
        }
        return ans == INT_MAX ? 0 : ans;
    }
};