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

文章目录

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

问题一 、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;
    }
};

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

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

相关文章

Harmony OS—UIAbility的使用

概述 UIAbility是一种包含用户界面的应用组件&#xff0c;主要用于和用户进行交互。UIAbility也是系统调度的单元&#xff0c;为应用提供窗口在其中绘制界面。一个应用可以有一个UIAbility&#xff0c;也可以有多个UIAbility&#xff0c;类似于Android 的 Activity&#xff0c…

咖啡机、电热水壶、豆浆机上架亚马逊美国站UL1082认证标准

咖啡机、电热水壶、豆浆机UL1082报告亚马逊美国站&#xff0c;UL1082标准是指室内用的&#xff0c;咖啡机、电热水壶、豆浆机以及滴落式类加热产品的标准。UL标准是美国的检测标准&#xff0c;目前跨境电商亚马逊美国站需要商家提供产品的UL报告&#xff0c;其中UL1082报告就是…

电脑篇——本地串口转TCP,TCP转虚拟串口,网络调试助手,串口调试助手

TCP/UDP工具、串口工具 https://pan.baidu.com/s/1SY03d_RRVhyOZfsPlApmxg?pwd5555 今日有个需求&#xff0c;就是在本机电脑上接了一个串口设备&#xff0c;然后我的QtCreator是在内网远程电脑运行的&#xff0c;我想将串口设备“挂载”到远程电脑上去调试程序&#xff0c;于…

微服务架构——笔记(4)

微服务架构——笔记&#xff08;4&#xff09; 基于分布式的微服务架构 本次笔记为 此次项目的记录&#xff0c;便于整理思路&#xff0c;仅供参考&#xff0c;笔者也将会让程序更加完善 内容包括&#xff1a;8001集群构建&#xff0c;负载均衡&#xff0c;服务发现&#xff0…

解决UniAD在高版本CUDA、pytorch下运行遇到的问题

UniADhttps://github.com/OpenDriveLab/UniAD是面向行车规划集感知(目标检测与跟踪)、建图(不是像SLAM那样对环境重建的建图&#xff0c;而是实时全景分割图像里的道路、隔离带等行车需关注的相关物体)、和轨迹规划和占用预测等多任务模块于一体的统一大模型。官网上的安装说明…

Solidity之变量数据存储和作用域

引用类型 引用类型(Reference Type)&#xff1a;包括数组&#xff08;array&#xff09;&#xff0c;结构体&#xff08;struct&#xff09;和映射&#xff08;mapping&#xff09;&#xff0c;这类变量占空间大&#xff0c;赋值时候直接传递地址&#xff08;类似指针&#xff…

Mysql8与mariadb的安装与常用设置

一、v10服务器mariadb的安装与常用设置 V10服务器默认安装了mariadb数据库。也可使用命令sudo yum install mariadb手动安装或升级默认安装的版本。 1.1 修改数据库密码 systemctl restart mariadb,重启mariadb服务&#xff1b;mysql -u root -p,要求输入密码直接回车&#…

Python 函数定义详解(More on Defining Functions)- 默认参数/位置参数/关键字参数

1.函数的定义和调用方法 1.1函数定义方法 """def 关键字用来定义一个函数。function_name 是函数名&#xff0c;应遵循命名规范。parameter1, parameter2, ... 是函数的参数列表&#xff0c;可以是任意数量和类型的参数。函数体是用缩进&#xff08;通常为4个…

k8s:kubectl 详解

目录 1 kubectl 2 基本信息查看 2.1 查看 master 节点状态 2.2 查看命名空间 2.3 查看default命名空间的所有资源 2.4 创建命名空间app 2.5 删除命名空间app 2.6 在命名空间kube-public 创建副本控制器&#xff08;deployment&#xff09;来启动Pod&#xff08;nginx-wl…

LaMa 论文复现:Resolution-robust Large Mask Inpainting with Fourier Convolutions

代码&#xff1a;GitHub - andy971022/auto-lama 论文&#xff1a;https://arxiv.org/abs/2109.07161 1 LaMa 论文简介 2 LaMa代码复现 2.1 环境部署 2.1.1 下载源码&#xff0c;创建环境&#xff0c;安装必需库 git clone https://github.com/advimman/lama cd lama con…

Figma转Sketch文件教程,超简单!

相信大家做设计的都多多少少听过一点Figma和Sktech&#xff0c;这2个设计软件是目前市场上很受欢迎的专业UI设计软件&#xff0c;在全球各地都有很多粉丝用户。但是相对来说&#xff0c;Figma与Sketch只支持iOS系统有所不同&#xff0c;Figma是一个在线设计软件&#xff0c;不限…

TikTok shop美国小店适合哪些卖家做?附常见运营问题解答

一、Tiktok shop小店分类 大家都知道&#xff0c;美国小店可以分为5 种&#xff1a; 美国本土个人店: 最灵活&#xff0c;有扶持政策&#xff1b;美国法人企业店&#xff1a;要求高&#xff0c;有扶持政策&#xff1b;美国公司中国人占股店 (ACCU店) : 权重相对低&#xff0c…

Java版本spring cloud + spring boot企业电子招投标系统源代码

项目说明 随着公司的快速发展&#xff0c;企业人员和经营规模不断壮大&#xff0c;公司对内部招采管理的提升提出了更高的要求。在企业里建立一个公平、公开、公正的采购环境&#xff0c;最大限度控制采购成本至关重要。符合国家电子招投标法律法规及相关规范&#xff0c;以及审…

《向经典致敬》第二届粤港澳大湾区著名歌唱家音乐会完美落幕

百年经典 歌坛盛会 “《向经典致敬》第二届粤港澳大湾区著名歌唱家音乐会暨2023福田人才之夜”完美落幕 2023年11月4日&#xff0c;阳光普照&#xff0c;秋意正浓&#xff0c;由中共深圳市福田区委宣传部、深圳市福田区文学艺术界联合会主办&#xff0c;深圳歌唱家协会承办&…

SpringBoot测试类启动web环境

1.坐标修改 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency> 2.测试类测试 说明&#xff1a;SpringBootTest()中的webEnvironment值的说明&#xff1b; 2.1不启…

VMware 虚拟机如何修改虚拟机系统的网卡速率为万兆——筑梦之路

1. 找到虚拟机系统安装目录 比如E:\vmware-system\kali\ 2. 找到vmx文件&#xff0c;用记事本打开 将 ethernet0.virtualDev "e1000" 这行改为 ethernet0.virtualDev "vmxnet3" 后保存&#xff08;注意vmxnet3全为小写&#xff09;&#xff0c;如果没…

Babylonjs学习笔记(九)——第一人称控制器

书接上回&#xff0c;实现第一人称控制器&#xff01;&#xff01;&#xff01; 以下步骤&#xff0c;缺一不可 相机相关设置 camera.applyGravity true; // 应用重力 camera.checkCollisions true; // 开启碰撞检测 const camera new FreeCamera("camera",ne…

Yakit工具篇:WebFuzzer模块之序列操作

简介 Web Fuzzer 序列就是将多个 Web Fuzzer 节点串联起来&#xff0c;实现更复杂的逻辑与功能。例如我们需要先进行登录&#xff0c;然后再进行其他操作&#xff0c;这时候我们就可以使用 Web Fuzzer 序列功能。或者是我们在一次渗透测试中需要好几个步骤才能验证是否有漏洞这…

Next.js 项目——从入门到入门(Eslint+Prettier)

Next.js官方文档地址 什么是 Next.js 这是一个用于生产环境的 React 框架。 Next.js 为您提供生产环境所需的所有功能以及最佳的开发体验&#xff1a;包括静态及服务器端融合渲染、 支持 TypeScript、智能化打包、 路由预取等功能&#xff0c;无需任何配置。 功能&#xff…

uniapp小程序接入腾讯云【增强版人脸核身接入】

文档地址&#xff1a;https://cloud.tencent.com/document/product/1007/56812 企业申请注册这边就不介绍了&#xff0c;根据官方文档去申请注册。 申请成功后&#xff0c;下载【微信小程序sdk】 一、解压sdk&#xff0c;创建wxcomponents文件夹 sdk解压后发现是原生小程序代…