Leetcode番外篇——滑动窗口的应用

news2024/12/22 19:49:59

各位好,博主新建了个公众号《自学编程村》,拉到底部即可看到,有情趣可以关注看看哈哈,关注后还可以加博主wx呦~~~(公众号拉到底部就能看到呦)

我们刚刚在上一节讲述了TCP的滑动窗口。殊不知,它在我们OJ当中也是有应用的。

我们来介绍几道题目来看看:

1、寻找异位词

438. 找到字符串中所有字母异位词 - 力扣(Leetcode)

 

这道题就可以很好地利用滑动窗口来解决。

代码附下,在代码给出之前,需要指出一些需要注意的地方。

1、滑动窗口需要注意的是:充分利用其特性——在滑动的时候,中间的大部分元素都是不变的,变化的仅仅是滑动窗口的两端。

2、滑动窗口可以进行优化:不需要重新开辟数组用于维护判断的条件,可以用差值来进行计算。

3、注意一个元素在滑动窗口中统计的时候是加还是减。我们这里统一约定:一个元素只要在滑动窗口中,就加,否则,就减。像本题的其他条件(串p)是用来将滑动窗口中的数据抵消掉的(所以抵消掉和元素不在都是减)。 —— 我们的核心是围绕着数据是否在滑动窗口里。

代码如下:

class Solution {
public:
    vector<int> findAnagrams(string s, string p) {
        int Ssize = s.size(),Psize = p.size();
        if(Ssize < Psize){
            return {};
        }
        int differ = 0;
        vector<int> v;
        vector<int> count(26,0);
        for(int i = 0;i < Psize; i++){
            --count[s[i]-'a'];
            ++count[p[i]-'a'];
        }
        for(auto& e: count){
            if(e != 0){
                ++differ;
            }
        }
        if(differ == 0){
            v.push_back(0);
        }
        for(int i = 0;i < Ssize-Psize;i++){
            if(count[s[i]-'a'] == -1){
                --differ;
            }
            else if(count[s[i]-'a'] == 0){
                ++differ;
            }
            count[s[i]-'a']++;

            if(count[s[i+Psize]-'a'] == 1){
                --differ;
            }
            else if(count[s[i+Psize] - 'a'] == 0){
                ++differ;
            }
            count[s[i+Psize]-'a']--;
            if(differ == 0){
                v.push_back(i+1);
            }
        }
        return v;
    }
};

我们再给出一道题:

2、滑动窗口最大值

239. 滑动窗口最大值 - 力扣(Leetcode)

这是一道非常典型的算法问题。
还是滑动窗口。
但是滑动窗口需要加上一些其他的东西。提示一下,可以和优先级队列或者是双关队列结合在一起。
 

本题的难度实际一般,关键就是需要想到取最大的数的时候,不要着急去删除就可以了。

不论是用优先级队列,还是用双向队列,都用到了这一点思想:即如果是最大的值被删掉了而它却仍然在我们所创建的数据结构里,不需要慌,只要在出来的时候(top的时候)判断一下它是不是在我们滑动窗口的范围之内就可以了。

我们将运用优先级队列和双关队列的方法都给出:

//运用优先级队列求解
class Solution {
public:
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        vector<int> v;
        priority_queue<pair<int,int>> mp;
        if(nums.size() == 0)return {};
        int max = nums[0];
        for(int i = 0;i < k; i++){
            mp.push(make_pair(nums[i],i));
            if(max < nums[i]){
                max = nums[i];
            }
        }
        v.push_back(max);
        for(int i = 0;i < nums.size() - k;i++){
           mp.push(pair<int,int>(nums[i+k],i+k));
           while(mp.top().second <= i){
               mp.pop();
           }
           max = mp.top().first;
           v.push_back(max);
        }
        return v;
    }
};
//运用双关队列求解
class Solution {
public:
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        deque<int> dq;
        vector<int> v;
        for(int i = 0;i < k; i++){
            while(!dq.empty() && nums[i] >= nums[dq.back()]){
                dq.pop_back();
            }
            dq.push_back(i);
        }
        v.push_back(nums[dq.front()]);
        //此时窗口已经形成
        for(int i = k;i < nums.size();i++){
            while(!dq.empty() && nums[i] >= nums[dq.back()]){
                dq.pop_back();
            }
            dq.push_back(i);
            while(dq.front() <= i - k){
                dq.pop_front();
            }
            v.push_back(nums[dq.front()]);
        }
        return v;
    }
};

好啦,本节的内容就到这里啦~~

原创不易,如果觉得写的不错,就点个赞呗~~~笔芯~~~~

下面是笔者的微信公众号,也欢迎来关注呀~~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/77667.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于RISC-V的Copy-On-Write

为什么需要写时拷贝呢&#xff1f; 当 shell执行指令的时候会 fork()&#xff0c;而这个 fork()出来的进程首先会调用的就是 exec来执行对应的命令&#xff0c;如果我们将 fork()创建的进程对地址空间进行了完整的拷贝,那将是一个巨大的消耗 因为在实际应用中&#xff0c;for…

微信小程序框架-全面详解(学习总结---从入门到深化)

小程序与普通网页开发的区别 小程序的主要开发语言是 JavaScript &#xff0c;小程序的开发同普通的网页 开发相比有很大的相似性。对于前端开发者而言&#xff0c;从网页开发迁移 到小程序的开发成本并不高&#xff0c;但是二者还是多少有些许区别的&#xff0c;例如&#xff…

HCIP实验 4-1:路由引入与路由控制

实验 4-1 路由引入与路由控制 学习目的 掌握OSPF与ISIS相互路由引入的配置方法掌握通过地址前缀列表过滤路由信息的配置方法掌握通过Route-policy过滤路由信息的配置方法 拓扑图 场景 你是你们公司的网络管理员。公司网络中有两部分路由区域&#xff0c;一部分运行OSPF,另外…

【Proteus仿真】【51单片机】厨房天然气泄漏检测报警系统

文章目录一、功能简介二、软件设计三、实验现象联系作者一、功能简介 本项目使用Proteus8仿真51单片机控制器&#xff0c;使用LCD1602、按键、天然气、烟雾传感器、ADC&#xff0c;报警模块等。 系统运行后&#xff0c;LCD1602显示传感器检测的天然气浓度和烟雾浓度值。 可通…

中国土地交易数据库:300w数据中国土地高频交易数据2000-2022

土地交易是土地在流通过程中多方发生的经济关系&#xff0c;土地交易的行为主要是交换的土地所有权、使用权、租赁权、抵押权等。在我国&#xff0c;土地作为一种重要资源&#xff0c;其收购储备和交易行为都由国家进行统一管理。经过改革开放几十年的探索和实践&#xff0c;土…

手机投影到电脑显示 此设备不支持miracast,因此不能以无线投影到它

在家里使用手机的体感游戏,发现手机屏幕比较小,想要将其投影到自己的笔记本电脑上,这样看得就比较大了。然后我就打开笔记本电脑,操作如下: 如下图: 原文地址:手机投影到电脑显示 此设备不支持miracast&#xff0c;因此不能以无线投影到它 - 廖强的博客 但是结果我们就看到了…

Mysql安装配置和Mysql使用六千字详解!!

目录 课前导读 一、Mysql的安装和配置 二、数据库简介&#xff1a; 1、数据库中典型代表&#xff1a; 2、数据库类型&#xff1a; 3、Mysql简介&#xff1a; 4、客户端和服务器简介&#xff1a; 三、初始MySQL 四、数据库操作 五、表的基本操作 六、表的基础增删查改…

虚拟主机、WordPress 主机和云主机之间的区别

&#x1f482; 个人网站:【海拥】【摸鱼游戏】【神级源码资源网站】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 想寻找共同学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】&#x1f4ac; 免费且…

[附源码]JAVA毕业设计校园失物招领管理系统(系统+LW)

[附源码]JAVA毕业设计校园失物招领管理系统&#xff08;系统LW&#xff09; 项目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目…

港科夜闻|罗康锦教授获委任为香港科大工学院院长

关注并星标每周阅读港科夜闻建立新视野 开启新思维1、罗康锦教授获委任为香港科大工学院院长。该委任任期由2023年1月1日开始。罗康锦教授服务香港科大多年&#xff0c;是智慧交通系统、智慧城市和可持续发展的杰出学者&#xff0c;在学术研究方面屡获殊荣。罗教授拥有丰富的学…

阿里巴巴内部最新发布SpringCloud ALiBaBa全彩版

就在昨天&#xff0c;阿里巴巴发布了最新的SpringCloud ALiBaBa全解第三版同时也是全彩版&#xff0c;话不多说我们直接来看干货&#xff01; 由于文章的篇幅有限&#xff0c;下面只能为大家展示目录内容&#xff0c;需要领取完整版可以文末免费获取章节目录 微服务介绍 微服务…

Go 实现插入排序算法及优化

Go 实现插入排序算法及优化插入排序算法实现算法优化小结耐心和持久胜过激烈和狂热。 哈喽大家好&#xff0c;我是陈明勇&#xff0c;今天分享的内容是使用 Go 实现插入排序算法。如果本文对你有帮助&#xff0c;不妨点个赞&#xff0c;如果你是 Go 语言初学者&#xff0c;不妨…

python基于SVM的疫情评论情感数据分析

1、构建SVM情感分析模型 读取数据 使用pandas的库读取微薄数据读取并使进行数据打乱操作 import pandas as pd test pd.read_csv(".\\weibo.csv") test_data pd.DataFrame(test)[:1000] test_data 打乱数据 re_test_data test_data.sample(frac1).reset_index(…

代码随想录训练营第44天|完全背包、LeetCode 518. 零钱兑换 II、 377. 组合总和 Ⅳ

完全背包 有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品都有无限个&#xff08;也就是可以放入背包多次&#xff09;&#xff0c;求解将哪些物品装入背包里物品价值总和最大。 完全背包和01背包问题唯一不同…

前端工程化实践——快速入门treeshaking

treeshaking treeshaking本质是去除多余代码算法。在前端的性能优化中&#xff0c;es6 推出了tree shaking机制&#xff0c;tree shaking就是当我们在项目中引入其他模块时&#xff0c;他会自动将我们用不到的代码&#xff0c;或者永远不会执行的代码摇掉&#xff0c;在…

【Java设计模式】用盖房子案例讲解建造者模式(生成器模式)

一、前言 今天学习了Java设计模式中的建造者模式&#xff0c;细心整理了学习笔记以及对这个模式的自我理解&#xff0c;希望大家喜欢&#xff01; 二、需求介绍 现在我们需要建房子&#xff0c;过程为打桩、砌墙、封顶。房子有各种各样的&#xff0c;比如普通房&#xff0c;…

【Java开发】 Spring 10 :Spring Boot 自动配置(Auto Configuration)原理及手动实现

用了这么久的 SpringBoot &#xff0c;我们再来回顾一下它&#xff0c;本文介绍 Spring Boot 的自动配置&#xff0c;这是它区别于 Spring 的最大的点&#xff0c;本文的自动配置项目包含三个项目&#xff0c;建议拉取仓库里的代码进行实践&#xff1a;尹煜 / AutoConfigDemo …

SOFA Weekly|MOSN v1.3.0 版本发布、公众号半自助投稿、本周 Contributor QA

SOFA WEEKLY | 每周精选 筛选每周精华问答&#xff0c;同步开源进展欢迎留言互动&#xff5e;SOFAStack&#xff08;Scalable Open Financial Architecture Stack&#xff09;是蚂蚁集团自主研发的金融级云原生架构&#xff0c;包含了构建金融级云原生架构所需的各个组件&#…

不接受反驳,性能最强,功能最强的Java日志框架

Logback 算是JAVA 里一个老牌的日志框架&#xff0c;从06年开始第一个版本&#xff0c;迭代至今也十几年了。不过logback最近一个稳定版本还停留在 2017 年&#xff0c;好几年都没有更新&#xff1b;logback的兄弟 slf4j 最近一个稳定版也是2017年&#xff0c;有点凉凉的意思。…

tep支持pytest-xdist分布式执行用例及合并Allure报告

tep近期更新频率较快&#xff0c;一方面是作者在积极投入到tep工具开发中&#xff1b;另一方面是我们聚集了20位小伙伴&#xff0c;一起合力打造EasyPytest测试平台&#xff0c;teprunner的FastAPI升级版本&#xff0c;依托于tep&#xff0c;帮你高效管理pytest测试用例。陆续也…