力扣hot10---大根堆+双端队列

题目:

大根堆思路:

维护最大值,应该首先想到大根堆。C++中对应着priority_queue,这里用pair<int,int>来记录对应的值和在nums中的索引。所以有priority_queue<pair<int,int>> q。在大根堆中,用q.top().first即可获取最大值。对于滑动窗口有三个步骤:处理进入的元素、处理出去的元素、记录结果。直接看代码吧,很清晰的。

大根堆代码

C++代码

class Solution {
public:vector<int> maxSlidingWindow(vector<int>& nums, int k) {//大根堆priority_queue<pair<int,int>> q;//初始化大根堆for(int i=0;i<k;i++){q.emplace(nums[i],i);}//初始化resvector<int> res={q.top().first};//处理后续窗口int len=nums.size();for(int i=k;i<len;i++){//进入q.emplace(nums[i],i);//出去while(q.top().second<=i-k){q.pop();}//记录答案res.push_back(q.top().first);}return res;}
};

对于priority_queue,增添元素为emplace,删除元素为pop。

定义小根堆的话(C++默认大根堆),需要把代码:

priority_queue<pair<int,int>> q;

转换为:(或者直接对元素取负就行)

priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;

python代码:

class Solution:def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:q=[]for i in range(k):heapq.heappush(q,(-nums[i],i))res=[-q[0][0]]len_nums=len(nums)for i in range(k,len_nums):heapq.heappush(q,(-nums[i],i))while q[0][1]<=i-k:heapq.heappop(q)res.append(-q[0][0])return res

注意,python中默认的是小根堆 ,需要导入包import heapq

对于加入元素操作:

heapq=[]
heapq.heappush(q,(-nums[i],i))

删除元素操作:

heapq.heappop(q)

双端队列思想:

  1. 滑动窗口加入元素
    每当从末端加入一个元素时,都要跟双端队列的末尾元素进行比较,如果末尾的元素更小,当加入该元素后,末尾元素一定不是最大值,所以在加入该元素之前,将末尾元素pop掉(这里运用while循环)。
  2. 滑动窗口移出元素

    加入该元素后,还要判断双端队列最开始的元素的索引是否在要求的滑动窗口中,如果不在,那需要把最前面的元素pop掉(while循环)。

  3. 记录答案

    可以考虑到这是一个递减的双端队列,所以最大值永远是第一个元素。

双端队列代码:

C++代码:

class Solution {
public:vector<int> maxSlidingWindow(vector<int>& nums, int k) {int len=nums.size();//只记录数组索引的双端队列deque<int> q;//初始化双端队列for(int i=0;i<k;i++){while(!q.empty() && nums[q.back()]<=nums[i]){q.pop_back();}q.push_back(i);}//初始化答案vector<int> res={nums[q.front()]};//滑动窗口---进入/移出/记录答案for(int i=k;i<len;i++){//进入while(!q.empty() && nums[q.back()]<=nums[i]){q.pop_back();}q.push_back(i);//移出while(q.front()<=i-k){q.pop_front();}//记录答案res.push_back(nums[q.front()]);}return res;}
};

python代码:

class Solution:def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:len_nums=len(nums)q=deque()for i in range(k):while q and nums[q[-1]]<=nums[i]:q.pop()q.append(i)res=[nums[q[0]]]for i in range(k,len_nums):while q and nums[q[-1]]<=nums[i]:q.pop()q.append(i)while q[0]<=i-k:q.popleft()res.append(nums[q[0]])return res

注意需要引入头文件from collections import deque

q=deque()
C++:q.back()
python:q[-1]
#双端队列deque插入/删除元素
q.append(i)
q.pop()
q.popleft()

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

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

相关文章

使用axios结合access_token和refresh_token进行无感刷新

这里利用到的主要是 axios 请求失败的config配置可以记住本次请求的参数&#xff0c;以及利用拦截器&#xff0c;等待刷新完后通过 axios(config) 再次发起请求。 小技巧&#xff1a;将每次请求失败的config和promise的resolve参数存放到数组中&#xff0c;等待刷新token完成再…

【框架学习 | 第一篇】一篇文章读懂MyBatis

文章目录 1.Mybatis介绍1.1Mybatis历史1.2Mybatis特点1.3与其他持久化框架对比1.4对象关系映射——ORM 2.搭建Mybatis2.1引入依赖2.2创建核心配置文件2.3创建表、实体类、mapper接口2.4创建映射文件2.4.1映射文件命名位置规则2.4.2编写映射文件2.4.3修改核心配置文件中映射文件…

vue中v-if和v-for优先级

在Vue中&#xff0c;v-for的优先级高于v-if。这意味着在同一个元素上使用v-if和v-for时&#xff0c;v-for将首先被解析&#xff0c;然后是v-if。 下面是一个代码示例&#xff1a; <template><div><div v-for"item in items" v-if"item.isDispl…

python七大爬虫程序

一&#xff0c;爬取豆瓣电影信息 import random import urllib.request from bs4 import BeautifulSoup import codecs from time import sleepdef main(url, headers):# 发送请求page urllib.request.Request(url, headersheaders)page urllib.request.urlopen(page)conten…

priority_queue 优先级队列

从大到小排序&#xff1b; #include<cstdio> #include<queue> using namespace std; priority_queue <int> q; int main() {q.push(10),q.push(8),q.push(12),q.push(14),q.push(6);while(!q.empty())printf("%d ",q.top()),q.pop(); }输出 14 1…

Linux基本命令

一、基本命令 修改mysql端口号 vim /etc/my.cnf云服务器ssh端口修改 vim /etc/ssh/sshd_config1.1 关机和重启 关机 shutdown -h now 立刻关机 shutdown -h 5 5分钟后关机 poweroff 立刻关机重启 shutdown -r now 立刻重启 shutdown -r 5 5分钟后重启 reboot 立刻重启1.2…

C++中erase、reverse的常用用法

reverse(start,end);该式子会将[start,end)范围内的字符串进行翻转。 注意&#xff1a;reverse函数仅适用于双向迭代器的容器&#xff0c;例如vector、list、deque等&#xff0c;reverse逆转后&#xff0c;原范围的迭代器仍然有效。 #include <iostream> #include <…

【python--读取文件夹下所有文件读取关键词】

&#x1f680; 作者 &#xff1a;“码上有前” &#x1f680; 文章简介 &#xff1a;Python &#x1f680; 欢迎小伙伴们 点赞&#x1f44d;、收藏⭐、留言&#x1f4ac; python练习题 抽取关键词 抽取关键词 import os import json import pandas as pd# 指定文件夹路径和关键…

代码随想录Day21 | Leetcode216 组合总和III、Leetcode17 电话号码的字母组合

一、第一题 找出所有相加之和为 n 的 k 个数的组合&#xff0c;且满足下列条件&#xff1a; 只使用数字1到9 每个数字 最多使用一次 返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次&#xff0c;组合可以以任何顺序返回。示例 1: 输入: k 3, n 7 输出: [[1,…

信息熵、KL散度、交叉熵、互信息、点互信息

信息熵 信息量 信息量是对信息的度量&#xff0c;衡量事件的不确定性&#xff0c;越小概率的事件发生了产生的信息量越大。我们应该用什么形式的函数表达信息量呢&#xff1f;除了随着概率增大而减少&#xff0c;这个函数还有具有以下性质&#xff1a; 如果有两个事件x和y彼…

如何定制聊天机器人,使用 Chatopera 云服务

在人工智能时代&#xff0c;Chatopera 相信&#xff0c;再小的个体&#xff0c;也有自己的聊天机器人。过去定制聊天机器人服务成本高、周期长&#xff0c;Chatopera 云服务重新定义聊天机器人。Chatopera 云服务于 2018 年 11 月 8 日上线&#xff0c;提供安全、稳定可靠的定制…

STM32标准库——(18)Unix时间戳、BKP备份寄存器、RTC实时时钟

1.Unix时间戳 1.1 简介 32位有符号数所能表示的最大数字是2^32/2-1这个数是21亿多&#xff0c;这其实是有溢出风险的&#xff0c;因为目前到2023年时间戳已经计到16亿了&#xff0c;32位有符号数的时间戳会在2038年的1月19号溢出&#xff0c;64位的时间戳能存储的时间范围非常…

C++对象模型剖析(六)一一Data语义学(三)

Data 语义学&#xff08;三&#xff09; “继承” 与 Data member 上期的这个继承的模块我们还剩下一个虚拟继承&#xff08;virtual inheritance&#xff09;没有讲&#xff0c;现在我们就来看看吧。 虚拟继承&#xff08;Virtual Inheritance&#xff09; 虚拟继承本质就是…

Linux笔记--make

使用上一节的 main.c、add.c、sub.c文件进行编译&#xff0c;编译的过程有很多步骤&#xff0c;如果要重新编译&#xff0c;还需要再重来一遍&#xff0c;能不能一步完成这些步骤?将这些步骤写到makefile文件中&#xff0c;通过make工具进行编译 一个工程中的源文件不计其数&a…

java 获取项目内的资源/配置文件

【getResourceAsStream】是java中用于获取项目内资源的常用方法&#xff0c;能够返回一个数据流&#xff0c;从而允许我们读取指定路径下的资源文件。这个方法可以用来读取各种类型的资源文件&#xff0c;包括但不限于文本文件、图像文件、配置文件等。 要使用getResourceAsStr…

高端相亲婚恋平台有哪些?分享五款高端靠谱相亲交友软件

如今市场上的相亲软件越来越多&#xff0c;但很少有人能找到自己心仪的相亲软件。在选择相亲软件时&#xff0c;大家最看重的就是安全性和真实性&#xff0c;因此我想向大家分享几款我用过且觉得可靠的高端相亲软件&#xff0c;希望能得到你们的认可。 1、丛丛 这是我用的最久的…

Nginx正反向代理

需求 为了降低成本并提高效率&#xff0c;考虑对华为云服务器的网络架构进行重构。 将原有的十一台云服务器公网IP整合为一台&#xff0c;部署 Nginx 作为公网服务器&#xff0c;并引入负载均衡器来分发流量。 Nginx正向代理 什么是正向代理&#xff1f; 正向代理&#xff…

【[STM32]标准库-自定义BootLoader】

[STM32]标准库-自定义BootLoader BootloaderBootloader的实现BOOTloader工程APP工程 Bootloader bootloader其实就是一段启动程序&#xff0c;它在芯片启动的时候最先被执行&#xff0c;可以用来做一些硬件的初始化或者用作固件热更新&#xff0c;当初始化完成之后跳转到对应的…

LeetCode 热题 100 | 图论(二)

目录 1 基础知识 1.1 什么是拓扑排序 1.2 如何进行拓扑排序 1.3 拓扑排序举例 2 207. 课程表 3 210. 课程表 II 菜鸟做题&#xff0c;语言是 C 1 基础知识 1.1 什么是拓扑排序 含义&#xff1a;根据节点之间的依赖关系来生成一个有序的序列。 应用&#xff1a…

12:Logstash|Web日志实时分析

Logstash|Web日志实时分析 logstashlogstash工作结构安装Logstash编写logstash配置文件步骤一:codec类插件插件帮助手册Logstash input插件步骤一:file模块插件filter grok插件Web日志实时分析部署beats与filebeat步骤一:filter grok模块插件logstash 一个数据采集、加工处…