LeetCode 209. 长度最小的子数组

题目链接

209. 长度最小的子数组

题目分析

这个题要我们求一个子数组,子数组意味着连续,而且这个题的数字全部都是正整数,刚好满足滑动窗口的条件,毫不犹豫就死命滑就完事了。

实现代码

class Solution {
    public int minSubArrayLen(int s, int[] nums) {
        //防止空测试用例出现
        if(nums.length < 1){
            return 0;
        }
        //使用滑动窗口思想,我们把慢指针调到-1,快指针从0开始
        int slow = -1;
        int fast = 0;
        //记录当前滑动窗口内的和
        int sum = 0;
        //使用一个较大的数来进行初始化res结果
        int res = nums.length+1;
        //当前滑动窗口内的长度
        int cur = 0;
        while(fast < nums.length){
            //累加和并且累加长度
            sum += nums[fast++];
            cur++;
            //当慢指针比快指针小并且滑动窗口内的和大于等于s的时候,开始收缩滑动窗口
            while(slow < fast && sum >= s){
                //获取res和当前长度res中较小的值
                res = Math.min(res,cur);
                //这里由于我们slow从-1开始,要先自增再使用
                sum -= nums[++slow];
                //滑动窗口左边界收缩
                cur--;
            }
        }
        //注意,这里要增加一个判断,否则会出现整个数组都不满足大于等于s的条件而导致的输出错误。
        return res == nums.length+1?0:res;
    }
}

总结

今天的每日一题还算是比较简单了,但是进阶的思想一开始还没想到。看了评论区才知道原来是要结合前缀和的思想来做。因为全部都是正数,我们的前缀和可以是递增的,因为nlogn的时间复杂度一般二分思想,而二分的基础就是有序。
容我再思考下:)

原文地址:https://www.cnblogs.com/ZJPaang/p/13201307.html