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

news2025/2/28 15:30:10

滑动窗口最大值 

题目链接:力扣

知识点:单调队列

解题思路:
需要一个队列,放进去窗口里的元素,然后随着窗口的移动,队列也一进一出,每次移动之后,队列告诉我们里面的最大值是什么。

其实队列没有必要维护窗口里的所有元素,只需要维护有可能成为窗口里最大值的元素就可以了,同时保证队列里的元素数值是由大到小的。

设计单调队列时,需要保持的规则:
pop(value):
如果窗口移除的元素value等于单调队列的出口元素,那么队列弹出元素,否则不用任何操作
push(value):
如果push的元素value大于入口元素的数值,那么就将队列入口的元素弹出,直到push元素的数值小于等于队列入口元素的数值为止
front():
保持如上规则,每次窗口移动的时候,只要问que.front()就可以返回当前窗口的最大值。

class MY_Queue     //为一个单调队列
{
    deque<int> MyQueue;
public:
  void pop(int value)                 //弹出元素
  {
      if(!MyQueue.empty() && value == MyQueue.front())   //窗口移除的元素value等于单调队列的出口元素
      MyQueue.pop_front();
  }

  void push(int value)                //加入元素  维护出口处的最大值
  {
      while(!MyQueue.empty() && value > MyQueue.back()) 
           MyQueue.pop_back();
          MyQueue.push_back(value);
  }

  int front()               //队列首元素,及最大值
  {
     return MyQueue.front();
  }

};


class Solution {
public:
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        vector<int> Res;
        MY_Queue MQ;

        for(int i = 0; i<k; i++)   //先将前k个元素放入
            MQ.push(nums[i]);
        Res.push_back(MQ.front());

        for(int i=k ;i<nums.size();i++)
        {
            MQ.pop(nums[i-k]);
            MQ.push(nums[i]);
            Res.push_back(MQ.front());
        }

        return Res;
    }
};

前 K 个高频元素

题目链接:力扣

解题思路:
1、如何求得数组中每个元素的频率 —— map (key存放元素,value存放出现次数)
2、如何对这个频率进行排序,并求前K个高频的元素 —— 大顶堆(父亲比孩子大)、小顶堆(父亲比孩子小)遍历map中的所有元素,并以value为基准进行统计,同时该堆只维护堆中的k个元素。
这里选择小顶堆,因为遇到较大的元素时,采用pop将堆中原来的最小元素移除,再push将该元素放入,这样留下的就是较大的元素。
在CPP中,可以选用优先级队列,即priority_queue

 由于要使用小顶堆,所以需要定义一个比较函数,用于确定元素的优先级。
在这个定义中,使用了一个名为mycomparison的自定义比较函数对象。

   //小顶堆
   class mycomparison{
        public:
          bool operator()(const pair<int, int>&lhs, const pair<int, int>&rhs)
          {
              return lhs.second > rhs.second;
          }

   };

 接下来的代码中,定义了自定义的优先级队列 pri_que
priority_queue<pair<int,int>,vector<pair<int,int>>,mycomparisom> pri_que;
具体来说,这个优先队列 pri_que 的定义包括以下几个部分:

  1. pair<int, int>表示队列中的元素类型为存储两个整数值的pair对象。每个pair对象有两个成员,分别命名为firstsecond,在这里分别表示整数值的第一个和第二个元素。

  2. vector<pair<int, int>>:作为优先队列的底层容器类型,使用vector来存储元素。这意味着优先队列中的元素将以向量的形式进行存储。

  3. mycomparison:是一个自定义的比较函数对象(Comparator),用于确定元素的优先级。在这个定义中,使用了一个名为mycomparison的自定义比较函数对象。

总的来说,这段代码定义了一个基于pair<int, int>类型的优先队列pri_que,底层使用vector作为容器,同时使用自定义的比较函数mycomparison来确定元素的优先级。

 vector<int> topKFrequent(vector<int>& nums, int k) {
        unordered_map<int,int>Mymap;
        vector<int> Res(k);

        for(int i=0; i<nums.size();i++)
        {
            Mymap[nums[i]]++;           //得到各元素的频率
        }

        priority_queue<pair<int,int>,vector<pair<int,int>>,mycomparisom> pri_que;

        for(auto it = Mymap.begin(); it != Mymap.end(); it++)
        {
            pri_que.push(*it);
            if(pri_que.size() > k)
              pri_que.pop();
        }

        for(int i=k-1;i>=0;i--)
        {
            Res[i] = pri_que.top().first;
            pri_que.pop();
        }

        return Res;
       
    }

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

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

相关文章

Java基础-Java常用类1(包装类 + Object类)

本篇文章主要讲解Java的常用类 包装类Object类 希望能对你的复习以及面试有帮助,有错误请指正 , 感谢. 目录 包装类 Object类 Object 类的常见方法有哪些&#xff1f; 对象比较(hashcode和equals方法) 和 equals() 的区别 hashCode() 是什么 ? 有什么用&#xff1f; 那…

【数据分享】中国首套10米分辨率的建筑高度数据(tif格式)

建筑是城市最重要的构成要素&#xff0c;高密度高层数的建筑是城市区别于乡村的显著特征&#xff01;建筑数据也是我们在各项研究中都会使用到的数据&#xff01;之前我们分享过2020年全国90个城市市域范围的建筑体块数据&#xff08;可查看之前的文章获悉详情&#xff09;。 …

Ubuntu2004设置共享开发环境

我们都知道Linux操作系统是一个多用户的操作系统&#xff0c;由于大家在实际工作中很少接触到多用户环境&#xff0c;特别是在目前电脑硬件成本不断降低的情况下几乎每个从事IT行业的人员都有一台甚至多台个人PC&#xff0c;因此大家对多用户的理解并不深刻。 ChatGPT引燃了人…

【数据结构】堆堆堆堆堆!

目录 前言 树 树的概念 树的相关概念​编辑 树的表示 二叉树的概念 特殊的二叉树 ​ 二叉树的存储结构 堆 堆的建立(本篇以小堆为例&#xff0c;大堆实现方法一样&#xff09; 堆的结构定义 堆的初始化 堆的插入 堆的基础算法——向上调整算法 插入注意事项 堆的判…

Openai+Coursera: ChatGPT Prompt Engineering(三)

想和大家分享一下最近学习的Coursera和openai联合打造ChatGPT Prompt Engineering在线课程.以下是我写的关于该课程的前两篇博客&#xff1a; ChatGPT Prompt Engineering(一) ChatGPT Prompt Engineering(二) 今天我们来学习第三部分内容&#xff1a;推断(Inferring) 推断…

Android:IPC(进程间通信)机制

Android&#xff1a;IPC&#xff08;进程间通信&#xff09;机制 进程和线程 我们先来了解一些关于线程和进程基本的概念。 按照操作系统中的描述&#xff0c;线程是CPU调度的最小单元&#xff0c;同时线程是一种有限的系统资源。而进程一般指一个执行单元&#xff0c;在PC和…

(学习日记)AD学习 #2

写在前面&#xff1a; 由于时间的不足与学习的碎片化&#xff0c;写博客变得有些奢侈。 但是对于记录学习&#xff08;忘了以后能快速复习&#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位&#xff0c;以时间为顺序&#xff0c;仅仅将博客当做一个知识学习的目录&a…

npm ERR! code E404 在vscode安装插件时报错的解决方案

答主在配置commit代码提交规范时【即如下代码】遇到了以下问题 npm i cz-customizable6.3.0 --save-dev 出现了 npm ERR! code E404 npm ERR! 404 Not Found - GET https://registry.npmjs.org/vue%2fvue-loader-v15 - Not found npm ERR! 404 ……等报错情况 解决方案1 检查n…

SVN 导出改动差异文件

文章目录 SVN 导出改动差异文件应用场景/背景介绍具体操作方法 SVN 导出改动差异文件 应用场景/背景介绍 当然下面的两个场景介绍可能用分支管理都会有不错的效果&#xff0c;或者更优&#xff0c;只是记录一下思路&#xff0c;用什么还是看大家个人爱好啦 在开发过程中偶尔会…

nexus私服仓库maven-metadata.xml缺失导致的构建失败或者下载504

环境&#xff1a;maven项目&#xff0c;使用Nexus私服&#xff0c;jenkins实现代码的编译和打包。 问题分析思路&#xff1a;某周末前&#xff0c;jenkins上的编译打包任务一直正常工作&#xff0c;但周末后突然所有项目都编译失败&#xff0c;报错很一致都是Could not find a…

【牛客刷题专栏】0x30:JZ38 字符串的排列(C语言编程题)

前言 个人推荐在牛客网刷题(点击可以跳转)&#xff0c;它登陆后会保存刷题记录进度&#xff0c;重新登录时写过的题目代码不会丢失。个人刷题练习系列专栏&#xff1a;个人CSDN牛客刷题专栏。 题目来自&#xff1a;牛客/题库 / 在线编程 / 剑指offer&#xff1a; 目录 前言问…

局域网与城域网 - ARP 地址解析协议

文章目录 1 概述2 ARP 地址解析协议2.1 工作过程2.2 报文格式2.3 ARP 命令 3 扩展3.1 网工软考真题 1 概述 #mermaid-svg-CQnNvTP8xFoJsztk {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-CQnNvTP8xFoJsztk .error-…

plt、fig、axes、axis的含义

plt import matplotlib.pyplot as plt figure,axes与axis 如果将Matplotlib绘图和我们平常画画相类比&#xff0c;可以把Figure想象成一张纸&#xff08;一般被称之为画布&#xff09;&#xff0c;Axes代表的则是纸中的一片区域&#xff08;当然可以有多个区域&#xff0c;这…

剑指 Offer - 字符串合辑

&#x1f34e;道阻且长&#xff0c;行则将至。&#x1f353; &#x1f33b;算法&#xff0c;不如说它是一种思考方式&#x1f340; 算法专栏&#xff1a; &#x1f449;&#x1f3fb;123 题解目录 一、&#x1f331;[剑指 Offer 05. 替换空格](https://leetcode.cn/problems/t…

[笔记]C++并发编程实战 《二》线程管理

文章目录 前言第2章 线程管理2.1 线程管理的基础2.1.1 启动线程2.1.2 等待线程完成2.1.3 特殊情况下的等待2.1.4 后台运行线程2.2 向线程函数传递参数 前言 第2章 线程管理 本章主要内容 启动新线程等待线程与分离线程线程唯一标识符 好的&#xff01;看来你已经决定使用多…

使用压缩包安装jdk多版本并能领过切换

使用压缩包安装jdk多版本并能领过切换 1.下载2.解压包到指定位置3.使用pdate-alternatives 进行版本切换管理3.1. jdk173.2. jdk1.8 3.切换版本4.解决JAVA_HOME环境变量识别的问题 1.下载 官网的下载地址&#xff1a; 下载地址&#xff1a; jdk17: jdk1.8在当前页面的下面: …

基于差分进化算法的微电网调度研究(Matlab代码实现)​

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

MAC突然打不开Notion,你遇到过这个问题吗?

目录 解决办法 为什么Notion会突然打不开呢&#xff1f; Notion是一款适合记录/规划的应用&#xff0c;而且页面简洁&#xff0c;模板强大&#xff0c;深得大家喜爱。我也经常在Notion上制定计划、记录学习笔记等。不过&#xff0c;今天突然打不开了&#xff0c;网页版、本地…

基于SpringBoot的生鲜管理系统的设计与实现

背景 困扰交易市场的许多问题当中,生鲜交易管理一定是交易市场不敢忽视的一块。但是管理好生鲜交易又面临很多麻烦需要解决,例如有几个方面:第一,生鲜市场往往人数都比较多,如何保证能够管理到每一个商家,如何在工作琐碎,记录繁多的情况下将生鲜交易的当前情况反应给领导相关部…

【大数据】Hadoop高可用集群搭建

知识目录 一、写在前面&#x1f495;二、Zookeeper安装✨三、Hadoop配置✨四、Hadoop HA自动模式✨五、HA脚本分享✨七、结语&#x1f495; 一、写在前面&#x1f495; 大家好&#xff01;这篇文章是我在搭建Hdfs的HA(高可用)时写下的详细笔记与感想&#xff0c;希望能帮助到大…