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

  • 相关阅读:
    5月13日工作日志(需求规格说明书4.0)
    第十次会议
    5月21日日志
    5月12日工作日志
    关于游戏平衡性——王者荣耀英雄伤害数值参考
    每天一点新东西(1)
    我在都匀做网优(补)
    我在都匀做网优
    不算新的开始
    input的focus事件时,鼠标光标在最后
  • 原文地址:https://www.cnblogs.com/ZJPaang/p/13201307.html
Copyright © 2011-2022 走看看