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

news2025/1/13 3:33:00

239 滑动窗口最大值

看完题后的思路

这是一道典型的单调队列的题,如果不是之前刷过一遍,对这道题没有一点头绪。即使刷过,也只是留了个印象。

解题思路

对于本道题来说,到窗口右移,如果一个新元素a进入窗口,a同时进入队列,为什么a会前方比它小的元素挤出队列呢?因为入队意味着 (1)我已经进入窗口了 (2)队列中前面比我小的元素在我如窗口后一定不会有机会再成为最大元素了,且它们一定先于我出队 所以这些元素可以出队
出队意味着:
(1)我还在窗口中,但我一定不可能成为最大元素了 (2)我即将不在窗口中了(此时我前面一定没有元素了)
步骤为:
出窗口元素出队(如果在队首的话)–>如窗口元素入队–>输出队首元素

代码

   class DandiaoQueue{
            private Deque<Integer> deque=new ArrayDeque<>();
            // 出队
            public void pop(Integer i){
                if (!deque.isEmpty()&&i.equals(deque.peekFirst())){
                    deque.pollFirst();
                }
            }

            // 入队
            public void push(Integer i){
                while (!deque.isEmpty()&&i>deque.getLast()){
                    deque.pollLast();
                }
                deque.offerLast(i);
            }

            // 获取队首元素
            public Integer getPeek(){
                return deque.peekFirst();
            }
        }
        public int[] maxSlidingWindow(int[] nums, int k) {
            ArrayList<Integer> list = new ArrayList<>();
            DandiaoQueue dandiaoQueue = new DandiaoQueue();
            for (int i = 0; i < Math.min(k,nums.length); i++) {
                dandiaoQueue.push(nums[i]);
            }
            list.add(dandiaoQueue.getPeek());
            for (int i = k; i <nums.length ; i++) {
                dandiaoQueue.pop(nums[i-k]);
                dandiaoQueue.push(nums[i]);
                list.add(dandiaoQueue.getPeek());
            }
            int[] ints = new int[list.size()];
            for (int i = 0; i <list.size(); i++) {
                ints[i]=list.get(i);

            }
            return ints;
        }

复杂度

时间复杂度 0(n)
空间复杂度 0(k)
在这里插入图片描述

遇到的困难/进一步优化/ 收获

三刷时看一遍,敲一遍代码

347.前 K 个高频元素

看完题后的思路

先使用map统计元素的出现次数,使用一个小根堆,大小为k。如果堆的大小小于k,直接插入元素,如果比堆顶元素小,直接略过,如果比堆顶元素大,插入根堆。
大小根堆的选择:
(1)大根堆保证堆头的元素是最大元素,如果堆的大小为k,可以保证是第k小元素,其余都比它小。小根堆最终保证堆头是最小元素,如果堆的大小为k,可以保证是第k大元素
(2)根堆的大小是需要在插入元素的时候人为控制的,例如小根堆,只允许插入比堆顶元素大的元素, 此时堆顶元素被删除
在java中如何定义大根堆与小根堆
http://t.csdn.cn/OOSnB
小根堆相当于升序,返回01-02
大根堆相当于降序,返回02-01

思路

见上文

代码

 public int[] topKFrequent(int[] nums, int k) {
            HashMap<Integer, Integer> map = new HashMap<>();
            for (int num : nums) {
                map.put(num,map.getOrDefault(num,0)+1);
            }
            PriorityQueue<int[]> smallHeap = new PriorityQueue<>(new Comparator<int[]>() {
                @Override
                public int compare(int[] o1, int[] o2) {
                    return o1[1]-o2[1];
                }
            });
            for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
                int[] ele = new int[]{entry.getKey(),entry.getValue()};
                if (smallHeap.size()<k||ele[1]>smallHeap.peek()[1]) {
                    if (smallHeap.size()==k){
                        smallHeap.poll();
                    }
                    smallHeap.add(ele);
                }
            }

            int[] ints = new int[k];
            int i=0;
            for (int[] ints1 : smallHeap) {
                ints[i++]=ints1[0];
            }
            return ints;

        }

复杂度

时间复杂度: 由0(nlogn)将至0(nlogk)
空间复杂度 0(k)
在这里插入图片描述

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

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

相关文章

【Maven】分模块开发与设计与依赖管理

目录 一、分模块开发与设计 1. 分模块开发的意义 2. 分模块开发&#xff08;模块拆分&#xff09; 二、依赖管理 1. 依赖传递 2. 可选依赖 3. 排除依赖 4 可选依赖和排除依赖的区别 一、分模块开发与设计 1. 分模块开发的意义 问题导入 分模块开发对工程有什么好处…

ChatGPT - 横看成岭侧成峰

定义 ChatGPT 是什么&#xff1f; ChatGPT是由OpenAI开发的一个人工智能聊天机器人程序&#xff0c;由 OpenAI 公司于2022年11月推出。该程序使用基于GPT-3.5架构的大型语言模型并通过强化学习进行训练。 ChatGPT以对话方式进行交互&#xff0c;可以用于包括自动文本生成、自…

一起自学SLAM算法:8.3 LOAM算法

连载文章&#xff0c;长期更新&#xff0c;欢迎关注&#xff1a; 不管是Gmapping还是Cartographer&#xff0c;通常都是采用单线激光雷达作为输入并且只能在室内环境运行。虽然Cartographer支持2D建图和3D建图模式&#xff0c;但是Cartographer采用3D建图模式构建出来的地图格式…

微信小程序 java失物招领系统uniAPP设计

开发语言&#xff1a;Java 框架&#xff1a;ssm JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.3.9 基于微信小程序的失物招领系…

四轮两驱小车(三):STM32驱动MPU6050进行转弯

前言&#xff1a; 寒假已经过了一半了&#xff0c;前段时间跟学弟一起从零开始搞了一下深度学习&#xff0c;现在才想起来这个系列还没有更完。本篇博客主要介绍一下这个小车转直角弯的神器----MPU6050 MPU6050介绍&#xff1a; 我所采用的MPU6050是某宝上十几块钱的这种&…

FPGA:Verilog HDL程序的基本结构

⭐本专栏针对FPGA进行入门学习&#xff0c;从数电中常见的逻辑代数讲起&#xff0c;结合Verilog HDL语言学习与仿真&#xff0c;主要对组合逻辑电路与时序逻辑电路进行分析与设计&#xff0c;对状态机FSM进行剖析与建模。 &#x1f525;本文已收录于FPGA系列专栏&#xff1a;FP…

Redis从入门到精通-常用命令

本文使用命令行模式进行操作 &#xff08;1&#xff09;keys keys的作用是返回所有符合条件的key的列表 *是返回所有的&#xff0c;名字不限制 也可以使用限制 这个命令的原理是查询到所有名字符合条件的&#xff0c;然后返回 练习可以用&#xff0c;但是千万别在生产环境使…

C++学习笔记之数组,结构体...

1️⃣.一维数组的声明&#xff1a; 一般声明&#xff1a;typeName arrayName[arraysize]; 要创建数组&#xff0c;可使用声明语句。数组的声明应该指出数组的①存储在每个元素中的值的类型②数组名③数组中的元素数 比如&#xff1a; short month[12] //create an array o…

各位软件工程师,你知道如何转行跨入Web3.0领域吗?

本篇博客介绍一些 Web3 领域相关知识&#xff0c;由于擦哥长期从事的 Python 研发工作&#xff0c;所以很多内容将从 Python 程序员的视角出发进行阐述。 本系列文章由擦哥撰写&#xff0c;下述用第三人称橡皮擦转述。 文章目录Web3 的学习路径Web3 是什么&#xff1f;语义网络…

轻松玩转树莓派Pico之六、pico-project-generator使用

之前几个项目&#xff0c;都是通过copy老项目的CMakeLists.txt方式来编译项目&#xff0c;今天来体验一下树莓派官方提供的工具pico-project-generator。pico-project-generator是树莓派官方出的Pico C SDK 项目的自动生成工具&#xff0c;该工具可以通过配置&#xff0c;自动生…

JavaEE9-Spring Boot概念,创建和运行

目录 1.Spring Boot是什么&#xff1f;为什么要学&#xff1f; 1.1.概念 1.2.优点 2.Spring Boot项目创建 2.1.使用Idea创建&#xff08;ide开发商提供&#xff09; 2.1.1.使用Idea社区版 2.1.2.使用Idea专业版 2.2.网页版创建&#xff08;Spring官方提供&#xff09; …

基于深度学习的车道线检测论文解读

Ultra Fast Structure-aware Deep Lane Detection 论文地址:https://arxiv.org/abs/2004.11757 1.任务概述 车道线检测使用OpenCV就能够实现,而基于深度学习的车道线检测尝试解决车道线检测中的遮挡问题。 数据集介绍: 常用数据集:CULane Dataset,Tusimple(特点就是非常…

PostgreSQL 逻辑复制搭建测试

一、 准备工作 1. Publication&#xff08;发布&#xff09;节点 postgersql.conf wal_level logical max_replication_slots 8 #每个订阅需要消耗一个slot max_wal_senders 10 #每个订阅需要使用一个wal sender max_worker_processes128 #必须 >max_wal_senders加并…

BIO NIO AIO IO多路复用的区别

1、基础概念 1.1、阻塞非阻塞和同步异步的结合 下面通过例子来具体说明&#xff1a; 同步阻塞&#xff1a; 小明一直盯着下载进度条&#xff0c;到100%的时候完成。 同步体现在&#xff1a;小明关注下载进度条并等待完成通知。&#xff08;可以看成同步是我主动关注任务完成的…

进度管理(上)

规划进度管理 定义&#xff1a;规划进度管理是为实施项目进度管理制定计划的过程。 输入&#xff1a; 1、项目管理计划 2、项目章程&#xff08;包含里程碑&#xff0c;这个和规划进度有直接干系&#xff09; 3、组织过程资产 4、事业环境因素。 输出&#xff1a;进度管…

2 线性回归demo数据-参数配置|训练回归模型|常见的tensor格式|Hub模块简介|气温数据集与任务介绍

文章目录线性回归demo数据-参数配置线性回归demo数据-训练回归模型常见的tensor格式scalarvectormatrix线性回归demo数据-参数配置 # 先传入数据&#xff0c;可以是手动定义&#xff0c;也可以导入&#xff0c;这边就直接拿一条直线y2x1&#xff0c;来进行模拟了。 # 构造x和y…

一篇五分生信临床模型预测文章代码复现——Figure 7 外部数据集验证模型

之前讲过临床模型预测的专栏,但那只是基础版本,下面我们以自噬相关基因为例子,模仿一篇五分文章,将图和代码复现出来,学会本专栏课程,可以具备发一篇五分左右文章的水平: 本专栏目录如下: Figure 1:差异表达基因及预后基因筛选(图片仅供参考) Figure 2. 生存分析,…

python爬虫学习笔记-SQL学习

Sql概述 先来看一个例子&#xff1a;小王第一次使用数据库&#xff0c;然后跟数据库来了个隔空对话 其实&#xff0c;我们想一想&#xff0c;mysql是一个软件&#xff0c;它有它自己一套的管理规则&#xff0c;我们想要跟它打交道&#xff0c;就必须遵守它的规则&#xff0c;如…

【stl -- 常用算法】

目录&#xff1a;前言一、遍历算法for_each、transform二、查找、统计算法find、find_ifadjacent_findbinary_searchcount、count_if三、排序算法sortrandom_shufflemergereverse拷贝、替换算法copyreplace、replace_ifswap算数生成算法accumulatefill集合算法set_intersection…

Day10 @Import整合第三方框架原理

1 前言Spring与MyBatis注解方式整合有个重要的技术点就是lmport&#xff0c;第三方框架与Spring整合xml方式很多是凭借自定义标签完成的&#xff0c;而第三方框架与Spring整合注解方式很多是靠import注解完成的。然后Import可以导入如下三种类&#xff1a;普通的配置类&#xf…