代码随想录Day13 | 239. 滑动窗口最大值 前 K 个高频元素

Cocos Creator Android打包:NDK版本选择与配置全攻略 在Android原生开发中,NDK(Native Development Kit)是编译C/C++代码的核心工具链,它决定了代码如何被编译为不同CPU架构(如ARMv7、ARM64)的动态库。其工作原理在于提供了一套完整的交叉编译环境,将高级语言代码转化为设备可执行的二进制指令。这一技术对于游戏引擎和性能敏感型应用至关重要,因为它能直接调用硬件资源,提升运行效率。在实际工程中,NDK版本必须与Android Gradle插件(AGP)版本、项目依赖的C++标准库精密匹配,否则会导致编译失败或运行时崩溃。特别 阅读详情

代码随想录Day13 | 239. 滑动窗口最大值 前 K 个高频元素

滑动窗口最大值

文档讲解:代码随想录
视频讲解: 单调队列正式登场!| LeetCode:239. 滑动窗口最大值
状态: ×

本题的思想就是利用一个单调队列来存储可能成为最大值的元素,单调队列的意思就是一个队列从出口元素到末尾元素是单调递增或者单调递减的。就拿这道题来说
按数组顺序向队列压入元素,如果push的元素比队列中的元素大,那么就pop掉所有比这个元素小的元素,直到队列中的元素比加入的元素大为止(pop_back())。
那么pop一个元素除了上面那种情况,还有就是滑动窗口在滑动的过程中,左边界已经超过了队列的出口元素,这时候就需要将出口元素pop掉。

//自定义一个单调队列,其队列中元素是单调递增的
class XQueue
{
private:
    deque<int> dque;

public:
    //基础弹出操作
    //当vector中的窗口左边界需要向前移动时,判断当前元素是否与队列的出口元素相等
    void pop(int value)
    {
        if(!dque.empty()&&value == dque.front())
        {
            dque.pop_front();
        }
    }

    //压入操作
    //处理掉队列中所有比value小的元素,如果没有则压入队尾,如果有则从队尾pop掉,直到队列中元素比value大为止
    void push(int value)
    {
        while(!dque.empty()&&dque.back()<value)
        {
            dque.pop_back();
        }
        dque.push_back(value);
    }

    //获取最大值,即队列的出口元素
    //每轮滑动窗口都获取一次
    int GetMax()
    {
        return dque.front();
    }
};

class Solution {
public:
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        XQueue dque;
        //结果数组
        vector<int> res;

        //初始化dque,nums前k个数据
        for(int i=0;i<k;i++)
        {
            dque.push(nums[i]);
        }
        //添加第一个最大值
        res.push_back(dque.GetMax());
        //滑动窗口
        for(int i = k;i<nums.size();i++)
        {
            //如果nums[i-k] = dque.front;相当于nums[i-k]已经不在窗口中那么需要pop
            dque.pop(nums[i-k]);
            //压入
            dque.push(nums[i]);
            //添加最大值
            res.push_back(dque.GetMax());
        }
        return res;
    }
};

时间复杂度:除了最后一组最大值之后的元素,每个元素被push和pop了一次, O ( 2 n − k ) = O ( n ) O(2n-k) = O(n) O(2n−k)=O(n)

前K个高频元素

文档讲解:代码随想录
视频讲解: 优先级队列正式登场!大顶堆、小顶堆该怎么用?| LeetCode:347.前 K 个高频元素

状态:×

利用优先级队列排序,其本质就是一个大顶堆或者小顶堆,而这道题要求我们计算频率最高的k个数,应当采用小顶堆,也就就是说当当前的k个数满了之后,要弹出最小值。

优先级队列和堆

class Solution {
public:

class mycomparison {
    public:
        bool operator()(const pair<int, int>& lhs, const pair<int, int>& rhs) {
            return lhs.second > rhs.second;
        }
    };
    vector<int> topKFrequent(vector<int>& nums, int k) {
        unordered_map<int,int> numsmap;
        for(int num : nums)
        {
            if(numsmap.find(num)!=numsmap.end())
            {
                numsmap.find(num)->second++;
            }
            else
            {
                numsmap.insert(pair<int,int>(num,0));
            }
        }

        //优先级队列 -- 小顶堆
        priority_queue<pair<int, int>, vector<pair<int, int>>, mycomparison> pri_que;

        //将Map的值push队列中会自动按照mycomparison排序
        for(unordered_map<int,int>::iterator it = numsmap.begin();it!=numsmap.end();it++)
        {
            pri_que.push(*it);
            if(pri_que.size()>k)
            {
                pri_que.pop();
            }
        }
        vector<int> res;
        for(int i = 0;i<k;i++)
        {
            res.push_back(pri_que.top().first);
            pri_que.pop();
        }
        return res;
    }
};

总结

文档讲解:代码随想录
视频讲解:
状态

栈的应用:在需要顺序匹配且匹配情况会影响下一轮结果的情况下可以考虑使用栈,先入后出的特性使得可以处理当前下标元素与该下标之前k个元素之间的关系。
比如像有效的括号这道题,匹配的情况就是i+1与i的匹配,同时还需要考虑 i+2与i-1的匹配,通过栈实现存储待匹配队列的左括号,下标大的就需要先匹配,就是一个典型的先进后出的应用。同样道理如同删除字符串中的所有相邻重复项,重复的删除后原本不相邻的元素会相邻,这时候使用栈可以是实现存储不重复的字符,因为一旦重复,那么就会从栈里弹出,这样就可以暴露先进栈的元素。
还有对于比较含退格的字符串,也可以使用栈。
对于使用栈的题都可以使用同向双指针解法来解决,比如删除元素,那么在匹配的情况下,左指针就需要进行退格操作了,而不是原地不动。

c++中的stack和queue不是容器,而是由容器构成的一种数据结构,可以叫做容器适配器
其底层实现可以是list vector deque甚至是链表
缺省的状态下是deque,栈和队列的内存分布取决于其底层容器的内存分布,deque的内存分布是不连续的

优先级队列:其默认底层容器为vector,本质就是一个由vector容器构成的大顶堆。会对加入的数据排序。
创建优先级队列是可以自定义排序规则。

template <typename T,typename Container=std::vector<T>,typename Compare=std::less<T> >
class priority_queue{
    //......
}
yolov26改进 | 融合改进篇 | 华为VanillaNet配合HSFPN助力yolov26有效涨点(教你如何融合创新点) 本文介绍华为VanillaNet主干与HSFPN融合改进的YOLOv26。VanillaNet采用极简卷积结构,减少复杂分支与冗余操作,兼顾特征提取效率;HSFPN原本面向白细胞多尺度检测,通过特征选择模块筛除无效响应,再利用特征融合模块整合不同层级信息,增强大小目标表达。两者分别优化Backbone与Neck,结构互补,可进一步搭配改进损失函数和检测头开展消融实验与论文创新。已有多位读者反馈在各自数据集上取得涨点。文中提供完整代码、配置文件、模块注册及Codex修改思路,方便复现。 阅读详情

相关推荐

【VMware篇】7-通过ISO镜像升级VMware Esxi

本文主要介绍Dell服务器上安装的ESXi升级的方法之一(采用ISO升级)。

chen_yunan的博客 5515

代码随想录刷题day13 239. 滑动窗口最大值、347.前 K 个高频元素

代码随想录刷题day13

weixin_43127049的博客 429

gmsv源代码c语言,石器时代ABLua的原理、简介、过程、运用、收发

操作原理(一)服务端:服务器源文件客户端:客户所操作的程序(既是游戏客户端)接口:既是某项功能(例如:鼠标点击,文字发送,战斗,观战,人物动作等)返回的值ABlua:在源代码中添加的整套引擎作为回调接口--lua所实现的功能是基于服务端源码添加的接口由该接口与客户端发送封包实现功能源码里是否有ABlua回调接口?例如:源码里的gmsv/battle.c文件(既是战斗回调文件)以下为简单描述C给予l...

weixin_35223575的博客 2408

代码随想录Day13 | 239. 滑动窗口最大值,347. 前 K 个高频元素

【栈与队列】239. 滑动窗口最大值,347. 前 K 个高频元素

weixin_43913958的博客 798

红外回充方案之红外接收和发射/附源码(1)

本文介绍了基于NEC协议的红外回充方案实现,重点讲解了红外收发原理和GD32F330单片机的接收端实现。文章首先说明采用38kHz载波和一体化红外接收管的设计优势,能有效抗环境光干扰。接着详细解析NEC协议格式,包括9ms起始信号、地址码、命令码及其反码校验机制,并给出逻辑1和0的调制方式。在接收端实现上,展示了GD32F330定时器输入捕获配置代码,通过双边沿触发测量脉冲宽度进行解码。文章还提供了状态机设计思路和数据结构,为低成本机器人红外回充方案提供了完整的技术实现方案。

m0_59406757的博客 1237

多目标跟踪中使用trackeval评估dancetrack运行结果

trackeval使用

qq_46144849的博客 1783

代码随想录-Day13 | LeetCode239. 滑动窗口最大值、LeetCode347.前 K 个高频元素

栈模型可以想象成一个顶端开口的瓶子,其特性是先进后出,后进先出。从随想录中针对栈的题目,其实不难发现由于这个后进先出的特性,非常适合元素的匹配问题,比如说LeetCode20. 有效的括号:寻找我们左括号相同类型的右括号,我们直接从栈顶元素去对比;还有LeetCode1047. 删除字符串中的所有相邻重复项:我们在遍历字符串的时候,一旦发现当前所遍历的元素和栈顶元素重复,直接从栈顶pop进而达到删除重复项的目的。

weixin_45923460的博客 1005

对西安交大轴承数据集XJTU-SY_Bearing_Datasets进行读取和处理:

故障诊断,对西安交大轴承数据集XJTU-SY_Bearing_Datasets进行读取和处理

qq_44757503的博客 6060

代码随想录算法训练营day13 | 239. 滑动窗口最大值、347.前 K 个高频元素

LeetCode | 239. 滑动窗口最大值、347.前 K 个高频元素

weixin_69675605的博客 1143

【WorkBuddy专栏09】WorkBuddy多模态能力深度揭秘

【WorkBuddy专栏09】AI不止会聊天——WorkBuddy多模态能力深度揭秘

AI人人懂 2108

【异常】安装hermes-agent时提示GnuTLS recv error (-110): The TLS connection was non-properly terminated.

Git克隆仓库时出现TLS连接异常报错的解决方案摘要: 当执行git clone命令时遇到"GnuTLS recv error (-110)"报错,通常由网络不稳定、缓冲区不足或证书验证问题导致。主要解决方案包括:1)增大Git HTTP缓冲区(git config --global http.postBuffer 524288000);2)使用GitHub镜像站加速克隆;3)临时禁用SSL验证进行测试;4)检查并调整代理配置;5)改用SSH协议克隆。建议优先尝试增大缓冲区和镜像站方案,

奶爸的编程之路,也就一周冷个三天 1350

代码随想录算法训练营 day13 || 239. 滑动窗口最大值,347. 前K个高频元素

解题状态:第一题在有了单调队列的思路后自行实现;第二题未能解出。239. 滑动窗口最大值思路:本题官方题解以及代码随想录所给出的代码中都用到了Deque这种双向队列,双向队列是一种首尾皆可出队与入队的特殊队列。这种工具非常值得学习,特别是我这个不会的人。回到这道题,由于我对双向队列的陌生,我认为与大多数栈与队列题目类似,栈与队列仅仅是一种数据存储的工具,因此可以采用任何容器结合静态指针实现栈与队列的模拟,甚至在一定程度上,会比声明Stack与Queue结构来的更加具有时间效率。

旭 1056

Windows部署OpenClaw报错不断?这篇环境配置指南帮你解决难题

想在Windows上部署OpenClaw却频频报错?🔧 本文详细梳理了OpenClaw部署必需环境的安装步骤和官方下载地址 📦,提供完整的验证清单和常见问题排查方法,帮你一次性搞定所有环境配置,顺利部署OpenClaw ✅

XiaoqiangClub的博客 6626

代码随想录算法训练营day13● 239. 滑动窗口最大值● 347.前 K 个高频元素● 总结

然后加入-3,前面的元素都比-3大,此时的最大值还是出口处的元素3。接下来,滑动窗口向后移动,pop3,加入5,前面的元素都比5小,将前面的元素都弹走,此时最大元素为出口处的5。接下来加入3,最大值为5,加入2,最大值为5。再向后移动,pop5,push1,最大值为3。最大值:{3,3,5,5,5,3}

m0_74845823的博客 1483

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

代码随想录算法训练营 DAY 13 | 239.滑动窗口最大值 347.前 K 个高频元素

比较一下队列和栈相关方法的不同:队列:add():在队尾添加元素remove():删除并返回队头isEmpty():是否为空栈:push():压入元素pop():弹出栈顶元素,并返回栈顶元素peek():返回栈顶元素empty():是否为空其他求长度size(),求堆头/栈顶peek()和清空clear()都是一样的!注意在java中,栈是一个实现类。而队列是一个接口,实现类有LinkedList和PriorityQueue关于deque队头元素:deque.peek()

qq_35904005的博客 964

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

代码随想录Day13:239.滑动窗口最大值,347.前 K 个高频元素

1.后进窗口的值如果比先进窗口的大,那么前面的比它小的值全部从窗口删除(因为先进窗口的肯定比后进窗口的先滑走,同时后进的值已经经比前面的值大了,前面的不会比后面的存活时间更长,所以成为最大值的可能性是0)2.后进窗口的值如果比前面的值小,那么排在前面元素值的后面,等待前面元素从窗口滑走,它就是下一个最大的。当最前端的元素要从窗口滑走时,从前pop,当进队元素比队中一些元素大时,从后pop。之后将要被滑出的元素pop,滑进来的元素push,再取一个最大值放进结果数组。3.这样在队首的就是此时窗口的最大值。

weixin_44218597的博客 630

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

代码随想录算法训练营第day13|239. 滑动窗口最大值、 347.前 K 个高频元素

寻找前k个最大元素流程如图所示:(图中的频率只有三个,所以正好构成一个大小为3的小顶堆,如果频率更多一些,则用这个小顶堆进行扫描)

qq_60513199的博客 891

代码随想录算法训练Day13|LeetCode239-滑动窗口最大值、LeetCode347-前K个高频元素

给你一个整数数组nums,有一个大小为k的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的k个数字。滑动窗口每次只向右移动一位。返回滑动窗口中的最大值。题目示例。

wish的博客 1267

代码随想录day13 | 239. 滑动窗口最大值、347. 前 K 个高频元素

在Java中,是一个基于优先级堆的无界队列实现。它是Queue接口的一个实现,但是与普通的队列不同,中的元素是按照它们的自然顺序或者通过构造函数提供的比较器来排序的。这意味着队列中的元素不是按照插入顺序存储的,而是按照它们的优先级进行排序。也就是说,只要加入的元素默认就会按照最小堆排序以下是如果要根据自定义的规则对元素进行排序,可以通过在构造函数中提供比较器来实现。比较器需要实现Comparator接口。上述代码创建了一个降序排序的优先级队列。要在中使用自定义比较器,你需要创建一个实现。

qq_45139829的博客 337

代码随想录训练营day13 239. 滑动窗口最大值 347.前 K 个高频元素

滑动窗口最大值,前k个高频元素

weixin_55496975的博客 149

代码随想录算法训练营day13|239.滑动窗口最大值、347.前K个高频元素

会超时,计算每个窗口内最大值,并将其加入最后的窗口最大值数组。这里我有使用一些剪枝,但仍会超时。具体代码如下。算法的时间复杂度为O(n*k),空间复杂度为O(n-k+1),简化为O(n)。

github_35852648的博客 1188

代码随想录算法训练营Day13|239滑动窗口最大值 347前k个高频元素

学习了Carl的视频。

luyimin87的博客 439

【Leetcode】-代码随想录算法训练营Day13|239. 滑动窗口最大值,347.前 K 个高频元素

思路分析+图解+代码,解析单调队列和优先级队列 Leetcode - 239. 滑动窗口最大值,347.前 K 个高频元素

weixin_45364118的博客 1813

代码随想录算法训练营Day13|Leetcode239滑动窗口最大值、Leetcode347前 K 个高频元素、总结

Day13打卡!今日感想:今天主要是队列相关的题,给栈和队列这章做个收尾。代码结合着解题思路能大致读懂,还是需要再复习一下的~💪

m0_60979177的博客 1450

代码随想录算法训练营day13|| 239. 滑动窗口最大值、347.前 K个高频元素、总结

寻找前k个最大元素流程如图所示:(图中的频率只有三个,所以正好构成一个大小为3的小顶堆,如果频率更多一些,则用这个小顶堆进行扫描)大家对这个比较运算在建堆时是如何应用的,为什么左大于右就会建立小顶堆,反而建立大顶堆比较困惑。确实 例如我们在写快排的cmp函数的时候,

qq_40222433的博客 695

代码随想录Day13|239.滑动窗口最大值、347.前K个高频元素、栈与队列总结

239.滑动窗口最大值、347.前K个高频元素、栈与队列总结

weixin_46620779的博客 2284
上一篇: 代码随想录Day 11| 20. 有效的括号1047. 删除字符串中的所有相邻重复项150. 逆波兰表达式求值
下一篇: 代码随想录Day14 | 二叉树、递归遍历、迭代遍历、统一迭代
sRiddle
博客等级 码龄7年 528粉丝 63原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值