class Solution {
 public:
     int minSubArrayLen(int s, vector<int>& nums)
     {
         ,r=-;          //由于数组是[]区间,所以这样使之不包含任何元素
         ;    //记录长度
         ;          //记录子数组的和
         while(l< nums.size())    //滑动过程,每一次while都走一步
         {

             <nums.size()&&sum<s)//同时保证有边界到底后不再继续拓展
                 sum+=nums[++r];
             else
                 sum-=nums[l++];

             if(sum>=s)          //每步生成子数组都判断条件
                 res=min(res,r-l+);
         }
         ) ;//没有更新,就是无解,就返回0
         else return res;
     }
 };

这是一道与连续子数组相关的问题,如果尝试用暴力求解,每次遍历得到子数组,则是O(n^3)。

为什么考虑用滑动窗口?

因为滑动窗口能不遗漏的获取连续子数组(这里的连续很关键),并且,如果窗口步长为1,则可以对每一种情况都进行条件判断,随时更新。

具体实现思路:

  1. 对于某一子数组[i,j],考虑其内部元素是否达到要求,未达到要求,则扩大数组,考虑到数组应是从头开始的,所以扩张时是对j扩张,每一次扩张都获得一个新子数组,之后进行子数组条件判断,只要没达到要求,就再扩张j,直到达到要求。
  2. 倘若达到要求了,那么记录下这一长度。可是单纯达到要求还不够呀,因为我们要的是对所有的连续子数组进行遍历查看。
  3. 于是保持j不变,使i++,这样获得了一个新的子数组,重复子数组条件判断,仍然满足要求,则更新长度,若没有满足要求了,就又回到1.

总结:

  简单来说,滑动窗口就是一种以单步走保证每种情况不遗漏的解法,最后时间复杂度只是O(n)(正比于走的路子2n)。

再来看leetcode 3。

 class Solution {
 public:
     int lengthOfLongestSubstring(string s)
     {
         ]={};
         ,r=-;
         ;
         while(l<s.size())
         {
             <s.size() && freq[s[r+]]==)
             {
                 r++;
                 freq[s[r]]++;
             }
             else
             {
                 freq[s[l++]]--;
             }

             res=max(res,r-l+);
         }
         return res;
     }
 };

可以看出,滑动窗口的模板是相对比较固定的。

对于一个滑动窗口,最大的循环是while(l<s.size()),是为了使得左边界也到达最大。之后是if(r+1<s.size() && freq[s[r+1]]==0),前半边是为了右边界在达到最大时不再继续扩张。

而这一if else循环是为了变动滑动窗口。

leetcode 209 3 滑动窗口的更多相关文章

  1. LeetCode编程训练 - 滑动窗口(Sliding Window)

    滑动窗口基础 滑动窗口常用来解决求字符串子串问题,借助map和计数器,其能在O(n)时间复杂度求子串问题.滑动窗口和双指针(Two pointers)有些类似,可以理解为往同一个方向走的双指针.常用滑 ...

  2. 【LeetCode】480. 滑动窗口中位数 Sliding Window Median(C++)

    作者: 负雪明烛 id: fuxuemingzhu 公众号: 每日算法题 本文关键词:LeetCode,力扣,算法,算法题,滑动窗口,中位数,multiset,刷题群 目录 题目描述 题目大意 解题方 ...

  3. 【leetcode】239. 滑动窗口最大值

    目录 题目 题解 三种解法 "单调队列"解法 新增.获取最大值 删除 代码 题目 给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧.你只可以 ...

  4. 【Leetcode 二分】 滑动窗口中位数(480)

    题目 中位数是有序序列最中间的那个数.如果序列的大小是偶数,则没有最中间的数:此时中位数是最中间的两个数的平均数. 例如: [2,3,4],中位数是 3 [2,3],中位数是 (2 + 3) / 2 ...

  5. Leetcode 239题 滑动窗口最大值(Sliding Window Maximum) Java语言求解

    题目链接 https://leetcode-cn.com/problems/sliding-window-maximum/ 题目内容 给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧 ...

  6. [LeetCode] Sliding Window Maximum 滑动窗口最大值

    Given an array nums, there is a sliding window of size k which is moving from the very left of the a ...

  7. [LeetCode] Sliding Window Median 滑动窗口中位数

    Median is the middle value in an ordered integer list. If the size of the list is even, there is no ...

  8. leetcode的Hot100系列--3. 无重复字符的最长子串--滑动窗口

    可以先想下这两个问题: 1.怎样使用滑动窗口? 2.如何快速的解决字符查重问题? 滑动窗口 可以想象一下有两个指针,一个叫begin,一个叫now 这两个指针就指定了当前正在比较无重复的字符串,当再往 ...

  9. [LeetCode] 239. Sliding Window Maximum 滑动窗口最大值

    Given an array nums, there is a sliding window of size k which is moving from the very left of the a ...

随机推荐

  1. Tukey法

    Tukey法 在介绍Tukey方法前,首先了解学生化极差分布. 在概率论和统计学中,学生化极差分布是极差的抽样分布.该分布是一种连续型概率分布,用于在样本量较小且总体标准差未知的情况下估计正态分布总体 ...

  2. github简单操作

    配置用户名: git config --global user.name 名.姓 配置用户邮件:git config --global user.email 名.姓@avatarmind.com 查看 ...

  3. pycharm里配置了项目虚拟环境,terminal打开并不是在虚拟环境下,如何解决

    在pycharm里,点开下方的Terminal,此时默认目录为当前项目对应的根目录, 第一步:输入  cd   venv\Scripts  进入Scripts目录 第二步:然后运行activate.b ...

  4. Python opencv PIL numpy base64互相转化

    PIL2numpy and numpy2PIL from PIL import Image import numpy image = Image.open('timg.jpeg')# image is ...

  5. Python 装饰器 多装饰器同时装饰一个函数 多参数函数

    装饰器是在不修改源代码的情况下,使用装饰器增加原函数的功能. 在软件开发中有一个原则——"开放-封闭",简单地说就是已经实现的功能不允许被修改,但可以被扩展. 封闭:已经实现的功能 ...

  6. Java使用JNDI技术获取DataSource对象

    package common; import java.sql.Connection; import java.sql.SQLException; import javax.naming.Contex ...

  7. SHELL用法八(Grep语句)

    1.SHELL编程Grep语句案例实战 1)Find是Linux操作系统文件和目录的路径检索.查询工具,而Grep是Linux系统下文本文件内容检索或者匹配工具,Grep称为全局正则表达式检索工具,在 ...

  8. Ubuntu12.10下安装Python3

    设置Python3.2为默认版本 ubuntu12.10下默认安装了Python2.7和Python3.2.3,并且设置了Python2.7为默认的版本,因此如果讨厌麻烦的话,可以直接将Python3 ...

  9. Archlinux系统运维

    本文将针对Archlinux下的系统运维进行介绍. 内核相关 查看当前内核版本 123 uname -r------------------------------------------------ ...

  10. eclipse、myeclipse使用常用的小技巧

    1.修改类名称上的@author  *** Preference----Java----Code Style----Code Templates----->Comments----->Ty ...