【力扣hot100题】(073)数组中的第K个最大元素

花了两天时间搞明白答案的快速排序和堆排序。
两种都写了一遍,感觉堆排序更简单很多。
两种都记录一下,包括具体方法和易错点。
快速排序
class Solution {
public:vector<int> nums;int quicksort(int left,int right,int k){if(left==right) return nums[k];int r=right;int mid=left;left--;right++;while(left<right){do left++; while(nums[left]<nums[mid]);do right--; while(nums[right]>nums[mid]);if(left<right) swap(nums[right],nums[left]);}if(right>=k) return quicksort(mid,right,k);else return quicksort(right+1,r,k);}int findKthLargest(vector<int>& nums, int k) {this->nums=nums;return quicksort(0,nums.size()-1,nums.size()-k);}
};
具体方案:定下首个元素的值为mid,设置双指针分别指向首个元素的前一位、最后一个元素的后一位,当左指针在右指针左边时,移动左指针到第一个大于mid的位置,移动右指针到第一个小于mid的位置,若左指针在右指针左边,则交换两者元素,循环以上。
循环最终结果:左指针指向从左往右第一个大于mid的元素,右指针指向从右往左第一个小于mid的元素,且左指针不在右指针左边。
(选择排序做法)继续递归右指针往右部分的数组和右指针往左部分的数组。
(这道题做法)若右指针的位置在k右边,则递归右指针往左部分,否则递归右指针往右部分。
初写时犯了不少错误,也有很多问题:
错误一:最后将mid移至left的位置

一开始的想法是mid既然是中间就要移到中间的位置,然后若mid正好在k的位置就可以直接返回mid,这样做很麻烦并且不一定正确。
错误二:将双指针分别设在首个元素的后一位、最后一个元素

这样做会忽略掉一些元素,这样的话循环就不能先do再while了,可能会陷入死循环,总之比较麻烦。
错误三:最终以左节点作为分割线
大概就是把
if(right>=k) return quicksort(mid,right,k);else return quicksort(right+1,r,k);
写成了:
if(left>=k) return quicksort(mid,left-1,k);else return quicksort(left,r,k);
其实现在也不是很明白为什么不能以左节点分割,我想可能是因为左指针最开始还要先经过mid,多了一次停留。
总之以后写快排的时候注意这几个地方就好了。
堆排序
堆排序做这题会更简单。
之前不知道堆是什么,现在才知道是一种二叉树,大根堆就是将大的数作为根节点。
class Solution {
public:void adjustheap(vector<int>& nums,int root){int left=root*2+1;int right=root*2+2;int maxx=root;if(left<nums.size()&&nums[left]>nums[maxx]) maxx=left;if(right<nums.size()&&nums[right]>nums[maxx]) maxx=right;if(maxx!=root){swap(nums[maxx],nums[root]);adjustheap(nums,maxx);}}void initheap(vector<int>& nums){for(int i=nums.size()/2-1;i>=0;i--){adjustheap(nums,i);}}int findKthLargest(vector<int>& nums, int k) {initheap(nums);for(int i=0;i<k-1;i++){nums[0]=-10001;adjustheap(nums,0);}return nums[0];}
};
这些函数包括初始化大根堆、调整大根堆的过程。
大根堆就是一个数组,只不过逻辑结构是二叉树,所以不用建树那些过程
初始化大根堆:
从最后一个非叶子节点(nums.size()/2-1)开始调整大根堆。
调整大根堆:
输入root节点,比较root和左右节点,最大的节点若不是root则和root交换,然后递归调整最大那个节点。
这道题不需要进行堆排序,只要构建完大根堆不断删除最顶节点k-1步即可。
相关文章:
【力扣hot100题】(073)数组中的第K个最大元素
花了两天时间搞明白答案的快速排序和堆排序。 两种都写了一遍,感觉堆排序更简单很多。 两种都记录一下,包括具体方法和易错点。 快速排序 class Solution { public:vector<int> nums;int quicksort(int left,int right,int k){if(leftright) r…...
【AAOS】【源码分析】CarAudioService(二)-- 功能介绍
汽车音频是 Android 汽车操作系统 (AAOS) 的一项功能,允许车辆播放信息娱乐声音,例如媒体、导航和通信。AAOS 不负责具有严格可用性和时间要求的铃声和警告,因为这些声音通常由车辆的硬件处理。将汽车音频服务集成在汽车中,彻底改变了驾驶体验,为驾驶员和乘客提供了音乐、…...
mapbox基础,加载F4Map二维地图
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性二、🍀F4Map 简介2.1 ☘️技术特点2.2 ☘️核…...
Android:Android Studio右侧Gradle没有assembleRelease等选项
旧版as是“Do not build Gradle task list during Gradle sync” 操作这个选项。 参考这篇文章:Android Studio Gradle中没有Task任务,没有Assemble任务,不能方便导出aar包_gradle 没有task-CSDN博客 在as2024版本中,打开Setting…...
DRAM CRC:让DDR5内存数据更靠谱
DRAM(动态随机存取存储器)是电脑内存的核心部件,负责存储和传输数据。如果数据在传输中出错,后果可能很严重,比如程序崩溃或者数据损坏。为了解决这个问题,DDR5内存引入了一个新功能,叫DRAM CRC(循环冗余校验)。简单来说,它是用来检查读写数据有没有问题的工具。 下面…...
RAI Toolbox详解
RAI Toolbox详解 摘要 RAI Toolbox是一个综合性的工具集,旨在帮助开发者和AI系统利益相关者更负责任地开发和监控AI系统,并做出更好的数据驱动决策。本文将详细介绍RAI Toolbox的功能、使用场景以及与类似AI项目的对比,帮助读者全面了解RAI…...
心率测量-arduino+matlab
参考:【教程】教你玩转Stduino之手指心跳检测模块 - 知乎 (zhihu.com) 1 原理 心跳检测模块,由一个红外线发射LED和红外接收器构成。手指心跳监测模块能够测量脉搏,是这样工作的:当手指放在发射器与接收器之间,红外发射…...
H3C的MSTP+VRRP高可靠性组网技术(MSTP单域)
以下内容纯为博主分享自己的想法和理解,如有错误轻喷 MSTP多生成树协议可以基于不同实例实现不同VLAN之间的负载分担 VRRP虚拟路由器冗余协议可以提高网关的可靠性防止单点故障的可能 在以前这两种协议通常一起搭配组网,来提高网络的可靠性和稳定性&a…...
字符串替换 (模拟)神奇数 (数学)DNA序列 (固定长度的滑动窗口)
⭐️个人主页:小羊 ⭐️所属专栏:每日两三题 很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~ 目录 字符串替换 (模拟)神奇数 (数学)DNA序列 (固定长度的滑动窗口&am…...
Centos7下安装hive详细步骤
在Centos 7系统上安装Hive的步骤如下: 下载Hive:首先,在Apache Hive的官方网站上下载最新版本的Hive压缩包,地址为:https://hive.apache.org/downloads.html。选择合适的版本并下载。 解压Hive压缩包:将下…...
Verilog学习-1.模块的结构
module aoi(a,b,c,d,f);/*模块名为aoi,端口列表a、b、c、d、f*/ input a,b,c,d;/*模块的输入端口为a,b,c,d*/ output f;;/*模块的输出端口为f*/ wire a,b,c,d,f;/*定义信号的数据类型*/ assign f~((a&b)|(~(c&d)));/*逻辑功能描述*/ endmoduleveirlog hdl 程…...
Linux驱动-块设备驱动
Linux驱动-块设备驱动 一,块设备驱动简介二,无请求队列情况(EMMC和SD卡等)三,请求队列情况(磁盘等带有I/O调度的设备)四,两者在驱动上区别 一,块设备驱动简介 块设备驱动…...
ffmpeg函数简介(封装格式相关)
文章目录 🌟 前置说明:FFmpeg 中 AVFormatContext 是什么?🧩 1. avformat_alloc_context功能:场景: 🧩 2. avformat_open_input功能:说明:返回值: ǹ…...
Android10.0 framework第三方无源码APP读写断电后数据丢失问题解决
1.前言 在10.0中rom定制化开发中,在某些产品开发中,在某些情况下在App用FileOutputStream读写完毕后,突然断电 会出现写完的数据丢失的问题,接下来就需要分析下关于使用FileOutputStream读写数据的相关流程,来实现相关 功能 2.framework第三方无源码APP读写断电后数据丢…...
[随笔] nn.Embedding的前向传播与反向传播
nn.Embedding的前向传播与反向传播 nn.Embedding的前向计算过程 embedding module 的前向过程其实是一个索引(查表)的过程 表的形式是一个 matrix(embedding.weight, learnable parameters) matrix.shape: (v, h) v:…...
搜广推校招面经七十一
滴滴算法工程师面经 一、矩阵分解的原理与优化意义 矩阵分解在推荐系统中是一个非常核心的方法,尤其是在 协同过滤(Collaborative Filtering) 中。我们可以通过用户对物品的评分行为来推测用户的喜好,从而推荐他们可能喜欢的内容。 1.1. 直观理解&…...
【算法学习】链表篇:链表的常用技巧和操作总结
算法学习: https://blog.csdn.net/2301_80220607/category_12922080.html?spm1001.2014.3001.5482 前言: 在各种数据结构中,链表是最常用的几个之一,熟练使用链表和链表相关的算法,可以让我们在处理很多问题上都更加…...
View UI (iview)表格拖拽排序
在使用 iView UI 的 Table 组件进行拖拽排序时,可以通过以下步骤获取最新的排序数据: 1. 启用拖拽功能 在 Table 组件上设置 draggable 属性,并绑定拖拽结束事件 on-row-drop。 <template><Table:columns"columns":dat…...
OpenNMT 部署和集成指南
OpenNMT(Open Neural Machine Translation)是一个开源的神经机器翻译(NMT)系统,由 Systran 和 Harvard NLP Group 在 2016 年联合推出。它的目标是为研究人员和企业开发者提供一个高质量、灵活且易于扩展的机器翻译框架…...
2台8卡L20服务器集群推理方案
1、整体流程梳理 #mermaid-svg-0aNtsWUnOH7ewXpN {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-0aNtsWUnOH7ewXpN .error-icon{fill:#552222;}#mermaid-svg-0aNtsWUnOH7ewXpN .error-text{fill:#552222;stroke:#55…...
HarmonyOS:使用geoLocationManager (位置服务)获取位置信息
一、简介 位置服务提供GNSS定位、网络定位(蜂窝基站、WLAN、蓝牙定位技术)、地理编码、逆地理编码、国家码和地理围栏等基本功能。 使用位置服务时请打开设备“位置”开关。如果“位置”开关关闭并且代码未设置捕获异常,可能导致应用异常。 …...
系统分析师(二)--操作系统
概述 进程管理 选项A:该进程中打开的文件 进程中打开的文件是由整个进程来管理的,同一进程下的各个线程都可以对这些打开的文件进行访问和操作,所以进程中打开的文件是可以被这些线程共享的。 选项B:该进程的代码段 进程的代码…...
安科瑞测频仪表:新能源调频困局的破局者
安科瑞顾强 在“双碳”目标推动下,风电、光伏等新能源正加速成为电力供应的核心力量。然而,新能源发电的间歇性与波动性,如同一把“双刃剑”,在提供清洁电力的同时,也给电网稳定运行带来了前所未有的挑战。国家能源局…...
富士相机照片 RAF 格式如何快速批量转为 JPG 格式教程
富士(Fujifilm)相机拍摄的 RAW 格式文件(RAF)因其高质量和丰富的图像信息而受到摄影师的喜爱。然而,RAF 文件通常体积较大且不易于分享或直接使用。为了方便处理,许多人选择将其转换为更通用的 JPG 格式。在…...
Linux 入门指令(1)
(1)ls指令 ls -l可以缩写成 ll 同时一个ls可以加多个后缀 比如 ll -at (2)pwd指令 (3)cd指令 cd .是当前目录 (4)touch指令 (5)mkdir指令 (6)rmdir和rm…...
Redis缓存数据库一致性
前言: 在系统开发中经常使用关系型数据库,为了提升关系型数据库的读性能,一般会使用redis加一层缓存,缓存和数据库是分离的两次操作,本文用来分析如何操作能保证缓存和数据库的数据一致性。 一、读场景 二、写场景 …...
Android Coil 3 Fetcher大批量Bitmap拼接成1张扁平宽图,Kotlin
Android Coil 3 Fetcher大批量Bitmap拼接成1张扁平宽图,Kotlin <uses-permission android:name"android.permission.WRITE_EXTERNAL_STORAGE" /><uses-permission android:name"android.permission.READ_EXTERNAL_STORAGE" /><u…...
文件相关:treecpmv命令扩展详解
拷贝和移动文件 序号命令对应英文作用01tree [目录名]tree以树状图列出文件目录结构02cp 源文件 目标文件copy复制文件或者目录03mv 源文件 目标文件move移动文件或者目录/文件或者目录重命名 一、 tree命令 (1)定义 tree 命令可以以树状…...
S32K144的m_data_2地址不够存,重新在LD文件中配置地址区域
在开发平台软件的时候代码中超出了64K的内存,单纯在ld文件中,增加m_data_2的存储长度,原先是0x00007000,我将长度修改为0x00008000,起始地址还是0x20000000,软件编译没有报错堆栈超出,但是软件下载到单片机中之后,144不…...
基于 SysTick 定时器实现任务轮询调度器
文章目录 前言一、SysTick 定时器介绍二、SysTick 驱动设计1. 初始化方法2. SysTick 中断函数3. 时间类 API 三、任务调度器设计1. 任务结构体2. 任务初始化3. 主调度器4. 调度器更新 四、任务函数实现五、总结1. 优缺点分析2. 扩展建议 前言 在嵌入式系统中,对于资…...
