day13 滑动窗口最大值 前K个高频元素

题目1:239  滑动窗口最大值

题目链接:239 滑动窗口最大值

题意

长度为K的滑动窗口从整数数组的最左侧移动到最右侧,每次只移动1位,求滑动窗口中的最大值

不能使用优先级队列,如果使用大顶堆,最终要pop的元素不知道是哪一个,因为大顶堆已经对队列中的元素进行排序了,元素的顺序发生了改变

暴力解法

对窗口内的所有元素进行排序

单调队列

由于窗口每次只移动1步,所以每真正push一次,就收集一次最大值即可,最大值放到队列的出口

队列只维护窗口中的最大值即可,且队列里的元素是从左到右依次递减的

pop():若滑动窗口原本要移除的元素(val)就是单调队列的出口(front)元素(滑动窗口的最大值),那么就弹出元素

push():如果要放入的元素(val)大于入口(back)的元素,就将入口处(back)小于val的元素逐个卷走,元素再在入口处(back)处入栈

getmaxvalue():每次移动窗口时,队列出口处(front())的元素即为当前窗口的最大值

伪代码

逻辑
例1:前一个滑动窗口删除的元素会不会影响后一个滑动窗口?

代码

class Solution {  
private:
    class MyQueue{
    public:
        deque<int> que;//双向队列
        void pop(int val){
            if(!que.empty()&&que.front()==val){
                que.pop_front();
            }
        }
        void push(int val){
            //去掉入口处比其小的元素
            while(!que.empty()&&que.back()<val){
                que.pop_back();
            }
            que.push_back(val);
        }
        int getmaxvalue(){
            return que.front();
        }
    };    
public:
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        MyQueue que;
        vector<int> result;
        for(int i=0;i<k;i++){
            que.push(nums[i]);
        }//第一个滑动窗口的元素
        result.push_back(que.getmaxvalue());
        for(int i=k;i<nums.size();i++){
            //先弹出元素,因为窗口的大小是一定的,只能先弹出元素,再放入元素
            que.pop(nums[i-k]);
            //再放入元素
            que.push(nums[i]);
            //求最大值
            result.push_back(que.getmaxvalue());
        }
        return result;
    }
};
  • 时间复杂度: O(n)
  • 空间复杂度: O(k)

题目2:347  前K个高频元素

题目链接:347 前K个高频元素

题意

返回整数数组nums中出现频率前k高的元素

暴力解法

使用map数组,元素是key,频率是value,然后将value从大到小排序,输出前k个元素(所有元素进行排序)

优先级队列(小顶堆)

为了优化时间复杂度,可以只维护k个元素,没有必要排序所有元素,想到使用优先级队列。

大顶堆,小顶堆擅长求解在大数据集内求排名靠前的元素,堆的底层实现是二叉树

那么使用大顶堆还是使用小顶堆呢?

如果使用大顶堆,那么加入该元素时,弹出最大值,不符题意

如果使用小顶堆,那么加入该元素时,弹出最小值,符合题意,所以,使用小顶堆

使用优先级队列实现大顶堆的话,cmopare函数从大到小排,实现小顶堆的话,compare函数从小到大排

伪代码

代码

class Solution {
public:
    class mycomparision{
    public:
        bool operator()(const pair<int,int>& kv1,const pair<int,int>& kv2){
            return kv1.second > kv2.second;
        }
    };//定义一个类之后,一定要添加;
    vector<int> topKFrequent(vector<int>& nums, int k) {
        unordered_map<int,int> map;
        //统计元素出现的频率
        for(int i=0;i<nums.size();i++){
            map[nums[i]]++;
        }
        //使用优先级队列定义小顶堆
        priority_queue<pair<int,int>,vector<pair<int,int>>,mycomparision> que;
        //pair<int,int>表示键值对的数据类型<元素(int),频率(int)>
        //vector<pair<int,int>>表示vector作为que的底层容器,存储元素
        //遍历map中的元素,小顶堆只维护前k个高频元素
        for(unordered_map<int,int>::iterator it=map.begin();it!=map.end();it++){
            que.push(*it);//*it代表迭代器it指向的key-value键值对
            if(que.size()>k){
                que.pop();//弹出当前小顶堆中的最小值
            }
        }
        //将小顶堆中频率排名前k的key元素按照频率从高到低放到数组中
        vector<int> result(k);//这里一定要定义result的大小,因为后续是对result的下标位置进行操作
        for(int i=k-1;i>=0;i--){
            result[i] = que.top().first;
            que.pop();
        }
        return result;
    }
};
  • 时间复杂度: O(nlogk)
  • 空间复杂度: O(n)
逻辑
例1:最后将堆中的元素放入到数组中时,如果写出这样
vector<int> result;

会报如下错误

原因就是还未给result数组分配内存空间,所以访问result[i]时出错,相当于访问了一个空的空间,和访问空指针差不多一个意思。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

React Native集成到现有原生应用

本篇文章以MacOS环境开发iOS平台为例&#xff0c;记录一下在原生APP基础上集成React Native React Native中文网 详细介绍了搭建环境和集成RN的步骤。 环境搭建 必须安装的依赖有&#xff1a;Node、Watchman、Xcode 和 CocoaPods。 安装Homebrew Homebrew是一款Mac OS平台下…

Java SE入门及基础(15)

Java 中的标号&#xff08;标签 label&#xff09; 1. 语法规则 标号名称 : 循环结构 2. 作用 标号的作用就是给代码添加一个标记&#xff0c;方便后面使用。通常应用在循环结构中&#xff0c;与break 语句配合使用 3. 应用场景 有如下菜单&#xff1a; 实现其中返回主菜…

C++ | 四、指针、链表

指针 指针用来储存地址定义方式&#xff0c;int *ptr;&#xff0c;使用*来表示所定义的变量是指针取地址符&#xff0c;ptr &a;&#xff0c;通过&来取得一个普通变量的地址&#xff0c;并储存到指针中取值&#xff08;解引用&#xff09;&#xff0c;想要取得一个指针…

qt.qpa.plugin: Could not find the Qt platform plugin “windows“ in ““

系统环境&#xff1a;Win10家庭中文版 Qt : 5.12.9 链接了一些64位的第三方库&#xff0c;程序编译完运行后出现 qt.qpa.plugin: Could not find the Qt platform plugin "windows" in "" 弹窗如下&#xff1a; 网上搜了一些都是关于pyQt的&#xff0c…

C++刷题 -- 栈和队列

C刷题 – 栈和队列 文章目录 C刷题 -- 栈和队列1.用栈实现队列2.用队列实现栈3.有效的括号4.前 K 个高频元素 1.用栈实现队列 力扣链接 一个栈自然实现不了队列功能&#xff0c;需要使用两个栈一个输入栈&#xff0c;一个输出栈队列是先入先出&#xff0c;当队列push操作&…

外包干了4年,废了···

有一说一&#xff0c;外包没有给很高的薪资&#xff0c;是真不能干呀&#xff01; 先说一下自己的情况&#xff0c;大专生&#xff0c;19年通过校招进入湖南某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0…

专业、高效的解决方案:为企业业务提供强大支持

随着市场竞争的日益激烈&#xff0c;企业要想在众多竞争对手中脱颖而出&#xff0c;必须具备强大的核心竞争力。而这种竞争力的源泉&#xff0c;往往来自于企业所提供的产品和服务。为了确保产品和服务的质量&#xff0c;企业需要不断地进行技术创新和管理创新&#xff0c;以满…

pytest pytest-cov生成代码覆盖率报告

pytest-cov 是一个用于 pytest 的插件&#xff0c;它可以生成代码覆盖率报告。代码覆盖率是一个度量&#xff0c;表示在测试过程中执行了代码的哪些部分。这是一个非常有用的工具&#xff0c;因为它可以帮助你理解你的测试是否全面&#xff0c;是否有遗漏的代码部分。 pytest-c…

性能测试jmeter

选的这些怎么添加 在一个列表里面 方法调用${__time(YMD)} 两个下划线&#xff0c;后跟函数名&#xff0c;小括号内是输入参数&#xff0c;整个用大括号包裹。 注意POST一定要在消息体数据里面写,不能再参数里面 否则报错:loginOut,没cookie等

express服务连接mysql数据库

下载mysql2依赖包 npm i mysql2 创建mysql连接实例并暴露出去 const mysql require(mysql2)const mysqlMode mysql.createPool({host: 127.0.0.1, //服务端hostuser: root, //用户名称,mysql一般默认rootpassword: 123456, //密码database: sqlTest1, //数据库名字…

了解Dubbo配置:优先级、重试和容错机制的秘密【五】

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 了解Dubbo配置&#xff1a;优先级、重试和容错机制的秘密【五】 前言Dubbo高级配置概述不同配置覆盖关系重试与容错处理机制负载均衡机制 前言 Dubbo作为一款强大的分布式服务框架&#xff0c;其高级…

【Linux】Git - 新手入门

文章目录 1. git 版本控制器 - 该如何理解&#xff1f;2. git / gitee / github 区别&#xff1f;3. Linux 中 git 的使用3.1 安装 git3.2 使用 github 新建远端仓库3.2.1 账号注册3.2.2 创建代码仓库3.2.3 克隆仓库到本地3.2.4 .gitignore 文件 3.3 使用 git 提交代码到 githu…

【嵌入式学习笔记-02】什么是库文件,静态库的制作和使用,动态库的制作和使用,动态库的动态加载

【嵌入式学习笔记-02】什么是库文件&#xff0c;静态库的制作和使用&#xff0c;动态库的制作和使用&#xff0c;动态库的动态加载 文章目录 什么是库文件&#xff1f;编程模型的发展什么是库文件&#xff1f; 静态库的制作和使用动态库的制作和使用动态库的动态加载 什么是库文…

网络文件共享服务

一.存储类型 直连式存储&#xff1a;Direct-Attached Storage&#xff0c;简称DAS 存储区域网络&#xff1a;Storage Area Network&#xff0c;简称SAN&#xff08;可以使用空间&#xff0c;管理也是你来管理&#xff09; 网络附加存储&#xff1a;Network-Attached Storage&…

gogs git创建仓库步骤

目录 引言创建仓库clone 仓库推送代码 引言 Gogs 是一款类似GitHub的开源文件/代码管理系统&#xff08;基于Git&#xff09;&#xff0c;Gogs 的目标是打造一个最简单、最快速和最轻松的方式搭建自助 Git 服务。 创建仓库 git中的组织可以把它看成是相关仓库的集合&#xff0c…

IO网络2.0

思维导图 机械臂 #include <stdio.h> #include <string.h> #include <stdlib.h> #include <myhead.h> #define SER_PORT 8888 #define SER_IP "192.168.122.68" //服务端//TCP客户端 int main(int argc, const char *argv[]) {//创建套接字…

大模型理论基础1

大模型理论基础1 第一章&#xff1a;引言 语言模型 自回归语言模型 概率的链式法则&#xff1a; 在自回归语言模型 p 中生成整个序列 X1:L&#xff0c;我们需要一次生成一个令牌(token)&#xff0c;该令牌基于之前以生成的令牌进行计算获得&#xff1a; 其中T≥0 是一个控…

HNU-算法设计与分析-实验4

算法设计与分析实验4 计科210X 甘晴void 202108010XXX 目录 文章目录 算法设计与分析<br>实验41 回溯算法求解0-1背包问题问题重述想法代码验证算法分析 2 回溯算法实现题5-4运动员最佳配对问题问题重述想法代码验证算法分析 3 分支限界法求解0-1背包问题问题重述想法…

2024年百场进校公益安全培训开启

自2023年年底&#xff0c;上海风暴救援队积极策划并推动了2024年的“百场进校传安全”培训项目。经过在东方锦绣于2023年12月14日、上钢新村幼儿园于2023年12月28日的先期测试&#xff0c;项目于2024年1月5日在齐河路幼儿园正式启动。随后&#xff0c;于2024年1月11日在浦南幼儿…

一款基于.NET开发的免费的火车票分流抢票软件

前言 接近年底了又到了全员抢票的日子&#xff0c;今天有同学在技术群里问有没有黄牛推荐帮忙抢车票的。今天分享一个我一直在用的基于.NET开发的、完全免费的火车票分流抢票软件&#xff1a;Bypass。 软件介绍 Bypass是一款基于.NET开发的、完全免费的火车票分流抢票软件&am…