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

news2024/11/24 1:12:14

文章目录

    • 对应力扣的题目链接
    • 思路分析
    • 解决方案

问题一 、239. 滑动窗口最大值

题目链接  239. 滑动窗口最大值 - 力扣(LeetCode)

思路分析 :

              1、可能首先想到的是暴力破解 ,每一个区间,遍历一遍,找到最大值。将其搜集起来。

              2、单调队列的思想 ,每次窗口移动的时候,调用que.pop(滑动窗口中移除元素的数                      值),que.push(滑动窗口添加元素的数值),然后que.front()就返回我们要的最大值。

              3、 当然这个队列是没有的,具体功能需要我们自己实现。

单调队列的实现(  基于一个双向队列  deque  可以对对头和队尾进行操作 )
my_push( )   入队 :

入队之前和队列中元素进行比较,如果队列中的元素比要入队的元素小,则将其出队。

这样我们队列的对头元素总是最大值,然后我们滑动窗口移动的时候,每次都从对头拿去窗口的最大值。

void  my_push( int value ){
    
    while( !my_queue.empty()  && my_queue.back() < value){
          my_queue.pop_back();
    }
    my_queue.push_back( value );
}

// my_queue  是我们定义的一个私有成员, 他是 deque 类型

my_pop( )   出队 :

因为我们在入队的时候,就已经将较小的元素出队了。

所以这里我们处理的是,如果窗口移除的元素value等于单调队列的出口元素,则将其出队。

 //出队
 void my_pop(int value){
     //当我们要入队的元素和队头元素相等时,说明要丢弃的是之前队列里面的最大值
     if(!my_queue_.empty() && value==myDeque_.front()){
          myDeque_.pop_front() ;
     }
 }

视频和更详细的文字讲解(代码随想录)

代码随想录

具体解决方案:

class Solution {
public:
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        myDeque myDeque_;
        vector< int >data;

        if( nums.size() < k )  return data;

        //先放入前k个元素
        for( int i = 0 ; i < k ; i++ ){
            myDeque_.my_push(nums[i]);
        }
        //找到前k个的最大值

        data.push_back( myDeque_.getMax() );
        for(int i=k ; i< nums.size() ; i++ ){
            myDeque_.my_pop( nums[i-k] );     //
            myDeque_.my_push( nums[i] );
           data.push_back( myDeque_.getMax() );
        }
        return data;
    }

private:
class myDeque{
    public:
    deque< int >myDeque_;    //定义一个双向队列
    //出队
    void my_pop(int value){
        //当我们要入队的元素和队头元素相等时,说明要丢弃的是之前队列里面的最大值
        if(myDeque_.empty()!=true && value==myDeque_.front()){
            myDeque_.pop_front() ;
        }
    }
    //入队
    void my_push(int value){
        while( myDeque_.empty()!=true && value > myDeque_.back() ){
            myDeque_.pop_back();
        }
        myDeque_.push_back(value);
    }
    
    int getMax(){
        return myDeque_.front();
    }
};
 
};

问题二 、347.前 K 个高频元素 

题目链接:

347. 前 K 个高频元素 - 力扣(LeetCode)

思路分析:

  • 遇到一个数出现的次数,我们首先想到 使用map 这个容器,key 记录要计算的数,value 出现的次数
  • 优先级队列(底层是实现是一个堆),将map中的数据进行排序,采用小顶堆
  • 最后反向输入到需要返回的数组中

视频和更详细的文字讲解(代码随想录):

代码随想录

解决方案:

class Solution {
public:
//自定义比较函数
class MyCompare{
    public:
        bool operator()(const pair<int ,int>&left , const pair<int ,int>&right){
            return left.second > right.second;
        }
};

    vector<int> topKFrequent(vector<int>& nums, int k) {
       
       // if(nums.size() < k ) return ret;
        unordered_map< int ,int >temp;
        // key 是数字, value是出现的次数
        for(int i=0 ; i<nums.size() ; i++){
            temp[ nums[i] ]++;
        }
       // 排序使用 ,小顶堆(优先级队列)
        priority_queue<pair<int, int>, vector<pair<int, int>>, MyCompare > pq;
       //将map中的数据放入优先级队列,并从小到大排序
       for(unordered_map<int,int>::iterator it = temp.begin() ; it!=temp.end() ; it++){
           pq.push(*it);
           if(pq.size() >k ){
               pq.pop();      //将最小的值出队
           }
           //入队,并排序
         
       }
       //将队列中的数据导入ret
        vector<int>ret(k);
       for( int i=k-1 ; i>=0 ;i--  ){
           ret[i]=pq.top().first;
           pq.pop();
       }
        return ret;
    }
};

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

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

相关文章

tracert命令

tracert tracert (跟踪路由)使路由跟踪使用程序&#xff0c;用于确定IP数据包访问目标所采用的路径。Tracert命令用IP生存时间&#xff08;TTL&#xff09;字段和ICMP错误消息&#xff0c;来确定从一个主机网络上其他主机的路由。 类似与Linux的traceroute 命令 命令格式 t…

PHP 在线学习平台系统mysql数据库web结构layUI布局apache计算机软件工程网页wamp

一、源码特点 PHP 在线学习平台系统是一套完善的web设计系统mysql数据库 &#xff0c;对理解php编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 PHP 在线学习平台系统1 代码 https://download.csdn.net/download/qq_41…

响应式成人高考自考教育机构网站模板源码下载带后台

模板信息&#xff1a; 模板编号&#xff1a;30558 模板编码&#xff1a;UTF8 模板分类&#xff1a;学校、教育、培训、科研 适合行业&#xff1a;教育机构类企业 模板介绍&#xff1a; 本模板自带eyoucms内核&#xff0c;无需再下载eyou系统&#xff0c;原创设计、手工书写DIVC…

LeetCode----149. 直线上最多的点数

 题目 给你一个数组 points &#xff0c;其中 points[i] [ x i x_i xi​, y i y_i yi​] 表示 X-Y 平面上的一个点。求最多有多少个点在同一条直线上。 示例 1&#xff1a; 输入&#xff1a;points [[1,1],[2,2],[3,3]] 输出&#xff1a;3 示例 2&#xff1a; 输入…

【通信原理】第三章 随机过程——例题

一、随机过程 1. 数学特征 ① 随机信号&#xff08;三角函数表达式&#xff09; ② 随机信号&#xff08;求和表达式&#xff09; 2. 功率谱密度 ① 相位确定&#xff0c;求功率谱密度 ② 已知相位分布&#xff0c;求功率谱密度 ③ 信号为两信号之和&#xff0c;求功率谱密度…

闲置电脑做什么副业赚钱?盘点如何利用电脑赚钱的方法

对于很多人来说&#xff0c;手机的强大功能使闲置的电脑被遗忘在角落。虽然现在手机已经取代电脑的很多用途。但是实际上&#xff0c;网络上还是有很多项目是手机不能展开的&#xff0c;而电脑方方面面都可以&#xff0c;所以&#xff0c;只要你愿意花些时间和精力&#xff0c;…

ConcurrentHashMap 源码解析

目录 一. 前言 二. 源码解析 2.1. 类结构 2.2. 基本属性 2.3. 构造方法 2.4. 增加元素 2.4.1. initTable() 2.4.2. helpTransfer() 2.4.3. transfer() 2.4.4. treeifyBin() 2.4.5. addCount() 2.5. 获取元素 2.6. remove() & replace() 2.7. clear() 2.8. s…

研发管理和项目管理有哪些痛点

研发管理和项目管理有哪些痛点 研发管理和项目管理有&#xff1a;1.项目进度把控难&#xff1b;2.绩效考核难&#xff1b;3.部门信息不同步&#xff1b;4.人力资源不均衡&#xff1b;5.需求管理难。项目进度把控难是研发管理和项目管理中的名列前茅痛点&#xff0c;要解决该问题…

引用类型;强引用;软引用;弱引用和虚引用

概述 平时在编写代码的时候内存都是由jvm管理&#xff0c;对象的回收也是jvm在管理&#xff1b; 但是有些时候jvm无法回收对象&#xff0c;最后就会抛出oom异常. 那么那些回收不了的对象肯定有区别于能回收的对象&#xff1b; 先上一波引用类型介绍 强引用 比如平常我们直…

Go进阶之rpc和grpc

文章目录 Go环境安装1&#xff09;windows2&#xff09;linux go语言编码规范1.1 包名&#xff1a;package1.2 ⽂件名1.3 结构体命名1.4 接⼝命名1.5 变量命名1.6 常量命名2.1 包注释2.2 结构&#xff08;接⼝&#xff09;注释2.3 函数&#xff08;⽅法&#xff09;注释2.4 代码…

三维变换与投影-计算机图形学

目录 三维变换与投影 三维变换原理 为什么C语言头文件要专门放在一个.h文件中呢&#xff1f; 斜投影原理 介绍一下什么是UGC 入口 透视投影 透视投影坐标系 三维变换与投影 三维变换原理 如何把三维物体投影到两维物体上 齐次坐标 加上一维&#xff0c;方便运算 …

chatGPT培训老师AIGC培训讲师叶梓:大模型这么火,我们在使用时应该关注些什么?-6

以下为叶老师讲义分享&#xff1a; P25-P29 提示工程的模式 节省计算资源&#xff1a; 在微调过程中&#xff0c;不需要重新训练整个模型&#xff0c;因此可以节省计算资源。 提高特定任务上的性能&#xff1a; 通过微调&#xff0c;模型可以适应特定任务的语言特征和模式…

实时定位与路径优化:跑腿App系统开发中的地理信息技术

本文将介绍如何使用地理信息技术实现实时定位和路径优化功能&#xff0c;以提高跑腿服务的效率。 实时定位 用户位置获取 # 示例&#xff1a;获取用户的实时位置 def get_user_location(user_id):# 使用GPS或网络定位技术获取用户的地理坐标# 返回经度和纬度信息return lon…

随笔记录-springboot_ConfigFileApplicationListener

SimpleApplicationEventMulticaster、 BootstrapApplicationListener、ConfigFileApplicationListener 加载流程 SpringApplication#run(java.lang.Class<?>[], java.lang.String[]) SpringApplication#run(java.lang.String…) SpringApplication#prepareEnvironment…

竞赛选题 深度学习火车票识别系统

文章目录 0 前言1 课题意义课题难点&#xff1a; 2 实现方法2.1 图像预处理2.2 字符分割2.3 字符识别部分实现代码 3 实现效果4 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 图像识别 火车票识别系统 该项目较为新颖&#xff0c;适…

Pod控制器详解

目录 一、Pod控制器及其功用 二、Deployment控制器 三、StatefulSet控制器 四、DaemonSet控制器 五、Job控制器 六、CronJob 控制器 一、Pod控制器及其功用 Pod控制器&#xff0c;又称之为工作负载&#xff08;workload&#xff09;&#xff0c;是用于实现管理pod的中间层…

DNS(Domain Name System) in detail

什么是 DNS&#xff1f; DNS&#xff08;域名系统&#xff09;为我们提供了一种与互联网上的设备进行通信的简单方法&#xff0c;而无需记住复数。就像每个房子都有一个唯一的地址来直接向它发送邮件一样&#xff0c;互联网上的每台计算机都有自己唯一的地址来与之通信&#xf…

Vue+OpenLayers 创建地图并显示鼠标所在经纬度

1、效果 2、创建地图 本文用的是高德地图 页面 <div class"map" id"map"></div><div id"mouse-position" class"position_coordinate"></div>初始化地图 var gaodeLayer new TileLayer({title: "高德地…

老李测评:网络电视盒子哪个好?双十一必看电视盒子推荐

大家好&#xff0c;我是测评人老李&#xff0c;双十一大促期间我们都在买买买&#xff0c;本期老李要分享的数码产品推荐是电视盒子&#xff0c;为了推荐更客观&#xff0c;老李购入了各平台热销的十几款电视盒子&#xff0c;通过两周的对比后&#xff0c;整理了这份电视盒子推…

Python中通过socketserver库创建服务端

socketserver库是Python的标准库&#xff0c;提供了套接字服务端的框架&#xff0c;通过该框架可以简化服务端的创建流程。 1 socketserver库的导入 通过如图1显示的代码导入socketserver库。 图1 导入socketserver库 2 通过socketserver库创建TCP服务端 通过socketserver库…