• 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的时间复杂度一般二分思想,而二分的基础就是有序。
    容我再思考下:)

  • 相关阅读:
    我开博客了,啦啦啦.
    cf593div2
    Comet OJ
    cf591div2abc
    cfround586ac
    cf589div2
    cf573div2
    Codeforces Round #569 (Div. 2)
    uva11729 水题
    luogu1984 [SDOI2008] 烧水问题
  • 原文地址:https://www.cnblogs.com/ZJPaang/p/13201307.html
Copyright © 2020-2023  润新知