Leetcode ---- 209. 长度最小的子数组

题目:

给定一个含有 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组如果不存在符合条件的连续子数组,返回 0。

示例: 

输入: s = 7, nums = [2,3,1,2,4,3]
输出: 2
解释: 子数组 [4,3] 是该条件下的长度最小的连续子数组。

进阶:

如果你已经完成了O(n) 时间复杂度的解法, 请尝试 O(n log n) 时间复杂度的解法。

思路:

查看题目,我们可以发现,最短的子数组有两个可能性:

1.  在最大数附近;

2.  在较大数附近;

也考虑到两种限制:

1.  最大值直接大于给定数值;

2.  所有数值相加小于给定数值;

针对以上,我们可以联想使用滑动窗口,即左右相同起点,右指针往右移直至累加值sum > s,再逐次将左指针右移,sum值递减,直到sum < s,再次移动右指针如此反复。期间,每当到达临界值的时候,记录最小长度。

程序:

class Solution {
public:
    int minSubArrayLen(int s, vector<int>& nums) {
        if (nums.empty())
            return 0;
        // 滑动窗口
        int left = 0;
        int right = -1;
        int sum = 0;
        int minlen = INT_MAX;
        int len = nums.size();
        while (right < len){
            while (sum < s && right < len){
                sum += nums[++right];
            }
            if (sum >= s){              
                if ((right - left + 1) <= minlen)
                    minlen = right - left + 1;
                sum -= nums[left++];
            }
        }
        return minlen < len ? minlen : 0;
    }
};

猜你喜欢

转载自blog.csdn.net/hc372893308/article/details/83118625