前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >【C++】算法集锦(7)滑动窗口

【C++】算法集锦(7)滑动窗口

作者头像
看、未来
发布于 2021-09-18 02:27:52
发布于 2021-09-18 02:27:52
92900
代码可运行
举报
运行总次数:0
代码可运行

文章目录

从LeetCode上的一道题说起

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组。如果不存在符合条件的连续子数组,返回 0示例: 

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

看到这个题,我不知道大家是怎么想的,我想到的就是暴力解法: 1、从头开始,以每个数字作为结果数组的头,找到刚好能大于s的结果数组。并记下结果数组中 [1:] 的和(Python写法),记为 t 。 2、如果 t 已经大于 s 了,那就结果数组头开始递减,一直减到 t 刚好小于 s 为止。 3、时刻保留一个最短子序列。 4、结果数组往后遍历一格,将值加入 t 当中。 5、回到第二步,直到结果序列的屁股顶到原序列的末位。 6、返回保留的最短子序列 的长度。


这是暴力解法吧,不知道为什么他们要叫这种解法为滑动窗口,还给出了不低的难度系数。。 如果看不懂我上面的表述,可以看图:(一图胜千言)


通过归纳,我们可以勾勒出滑动窗口法的大体框架(只是基本框架,根据不同的问题应适当变动,重在把握精神)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
初始化窗口端点LR,一般L0R1
    初始化最优值
    while R < len(Array):
        while R < len(Array):
            R += 1              #移动右端点
            if R < len(Array):
                更新状态        
            if 状态满足条件:
                可选的更新最优值的位置
                break           #一旦满足条件即跳出
        if R == len(Array):     # 若循环是由于移动到数组末尾结束,则停止整个程序。因为之后已经不再有可能的解
            break
        while L < R:
            更新状态    # 移动左端点,需要更新状态
            L += 1
            if 状态满足条件:
                可选的更新最优值的位置
            else:  # 一旦窗口所在区间不再满足条件即跳出,去移动右端点
                break
        可选的对于LR端点的后续处理
    return 最优值

继续看题,今天不聊天。

无重复字符的最长子串

给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。

示例 1:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
输入: "abcabcbb"
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
输出: 3 
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3

示例 2:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
输入: "bbbbb"
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1

示例 3:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
输入: "pwwkew"
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
     请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

思路:

这道题主要用到思路是:滑动窗口 什么是滑动窗口? 其实就是一个队列,比如例题中的 abcabcbb,进入这个队列(窗口)为 abc 满足题目要求,当再进入 a,队列变成了 abca,这时候不满足要求。所以,我们要移动这个队列!

如何移动? 我们只要把队列的左边的元素移出就行了,直到满足题目要求! 一直维持这样的队列,找出队列出现最长的长度时候,求出解! 时间复杂度:O(n)

代码实现:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        if(s.size() == 0) return 0;
        unordered_set<char> lookup;
        int maxStr = 0;
        int left = 0;
        for(int i = 0; i < s.size(); i++){
            while (lookup.find(s[i]) != lookup.end()){
                lookup.erase(s[left]);
                left ++;
            }
            maxStr = max(maxStr,i-left+1);
            lookup.insert(s[i]);
    }
        return maxStr;
        
    }
};

多说无益,精练才是王道。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/02/22 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
动态中的守候:滑动窗口与距离的诗篇
根据你提供的图片,题目是**“长度最小的子数组”**(Leetcode 209 题),具体信息如下:
凯子坚持C
2024/10/22
780
动态中的守候:滑动窗口与距离的诗篇
leetcode必备算法:聊聊滑动窗口
我们刷leetcode的时候,经常会遇到滑动窗口类型题目。滑动窗口问题非常经典,也很有技巧性,一般大厂也喜欢问。今天跟大家一起来学习滑动窗口的套路,文章如果有不正确的地方,欢迎大家指出哈,感谢感谢~
捡田螺的小男孩
2021/11/15
1.7K0
leetcode必备算法:聊聊滑动窗口
【优选算法】探索双指针之美(一): 同向双指针缔造滑动窗口
在上一章中想必我们已经领略到了双指针和单调性相遇后擦出的美妙火花,在这章中我们就来一起探索一下同向双指针又有怎样的独特风味
_孙同学
2024/11/13
1220
【优选算法】探索双指针之美(一): 同向双指针缔造滑动窗口
【Leetcode-滑动窗口问题】
找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, …, numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。
每天都要进步呀
2023/03/28
3520
【Leetcode-滑动窗口问题】
python 无重复字符的最长子串
输入: "abcabcbb" 输出: 3  解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。 示例 2:
葫芦
2020/03/02
2.2K0
七十四、滑动窗口最值问题
滑动问题包含一个滑动窗口,它是一个运行在一个大数组上的子列表,该数组是一个底层元素集合。一般用来求最值问题。
润森
2022/08/17
3140
七十四、滑动窗口最值问题
【优选算法篇】编织算法的流动诗篇:滑动窗口的轻盈之美
题目链接:209. 长度最小的子数组 题目描述: 给定一个含有 n 个正整数的数组 nums 和一个正整数 target。 找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0。
半截诗
2024/10/20
1500
【算法专题】滑动窗口
找出该数组中满足其和 ≥ target 的长度最小的 连续子数组[numsl, numsl + 1, …, numsr - 1, numsr] ,并返回其长度。 如果不存在符合条件的子数组,返回 0 。
YoungMLet
2024/03/01
1350
字符串最长子串难?滑动窗口拯救你
要求字符串的不含有重复字符的最长子串的长度,只需要先找到最长子串然后再求其长度即可,找最长子串我们可以通过滑动窗口的方法去查找。
程序员小熊
2021/05/28
9170
字符串最长子串难?滑动窗口拯救你
【oj刷题】滑动窗口篇:滑动窗口的应用场景和注意事项
[numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。
GG Bond1
2024/09/17
3870
【oj刷题】滑动窗口篇:滑动窗口的应用场景和注意事项
基础算法---滑动窗口
滑动窗口(Sliding Window)是一种在计算机科学中用于解决各种子数组或子字符串问题的技术。滑动窗口技术通过维护一个固定大小的窗口在数组或字符串上移动,从而使得可以在较短的时间内解决一些复杂的问题。这种方法在处理一系列数据时特别高效。滑动窗口(Sliding Window)是一种在计算机科学中用于解决各种子数组或子字符串问题的技术。滑动窗口技术通过维护一个固定大小的窗口在数组或字符串上移动,从而使得可以在较短的时间内解决一些复杂的问题。这种方法在处理一系列数据时特别高效。
用户11305458
2024/10/09
6620
基础算法---滑动窗口
有点难度,几道和「滑动窗口」有关的算法面试题
滑动问题包含一个滑动窗口,它是一个运行在一个大数组上的子列表,该数组是一个底层元素集合。
五分钟学算法
2019/05/06
9550
有点难度,几道和「滑动窗口」有关的算法面试题
漫画:滑动窗口系列 第二讲(无重复字符的最长子串)
在上一节中,我们使用双端队列完成了滑动窗口的一道颇为困难的题目,以此展示了什么是滑动窗口。在本节中我们将继续深入分析,探索滑动窗口题型一些具有模式性的解法。
程序员小浩
2020/03/30
4740
漫画:滑动窗口系列 第二讲(无重复字符的最长子串)
【算法一周目】滑动窗口(1)
题目链接:209. 长度最小的子数组 题目描述: 给定一个含有 n 个正整数的数组 nums 和一个正整数 target。 找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0。
HZzzzzLu
2024/11/26
820
【算法一周目】滑动窗口(1)
我爱学算法之——滑动窗口攻克子数组和子串难题(上)
至于什么是"滑动窗口"呢?简单来说就是同向双指针;现在来通过题目来了解什么是"滑动窗口"
星辰与你
2025/03/19
670
我爱学算法之——滑动窗口攻克子数组和子串难题(上)
【C++例题 / 训练】滑动窗口(总结&&例题)
本篇主要总结关于滑动窗口的相关做题技巧与注意事项,滑动窗口也用到了双指针的内容,可以参考这篇文章【算法/学习】双指针-CSDN博客 ,本篇主要用于在了解滑动窗口的构造后,快速掌握滑动窗口的做题技巧与做题模板,便于以后复习参阅
IsLand1314
2024/10/15
1360
【C++例题 / 训练】滑动窗口(总结&&例题)
前端学数据结构与算法(十二):有趣的算法 - 多指针与滑动窗口
如果说如何用算法高效有趣的解决某些问题,那多指针和滑动算法绝对是算其中的佼佼者。这也是笔者最初接触算法时觉得最有意思的一点,因为解决的问题是熟悉的,但配方却完全不同,本章我们从一个简单的交集问题出发,一步步的认识到多指针及滑动窗口解决某些问题时的巧妙与高效,本章主要以解LeetCode里高频题为参考~
飞跃疯人院
2020/11/19
5960
算法专题二: 滑动窗口
首先暴力解法就是依次枚举出所有的子数组, 从第一个元素为左端点依次向后枚举, 枚举到长度大于target就停止枚举, 以第二个元素为左端点进行枚举, 这里我们可以进行优化.
用户11317877
2024/10/16
1190
算法专题二: 滑动窗口
听说你还不会滑动窗口?来一篇文章带你学会滑动窗口算法
无重复字符的最长子串 这道题主要就是滑动窗口的思想,何为滑动窗口? 其实就是一个队列,比如例题中的 abcabcbb,进入这个队列(窗口)为 abc 满足题目要求,当再进入 a,队列变成了 abca,这时候不满足要求。所以,我们要移动这个队列!也是单调队列的经典应用 把最左边的队列持续移出,保留其最大长度,维持这个最大长度的队列,即是题目解 class Solution { public: int lengthOfLongestSubstring(string s) { if(
秋名山码神
2022/12/13
2020
滑动窗口详解
暴力解法:枚举出所有的情况,然后判断长度和区间和,这种方法的时间复杂度最优为O(n^2)
2的n次方
2024/10/15
1240
滑动窗口详解
推荐阅读
相关推荐
动态中的守候:滑动窗口与距离的诗篇
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档