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

news2025/4/17 22:04:08

花了两天时间搞明白答案的快速排序和堆排序。

两种都写了一遍,感觉堆排序更简单很多。

两种都记录一下,包括具体方法和易错点。

快速排序

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步即可。

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

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

相关文章

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” 操作这个选项。 参考这篇文章&#xff1a;Android Studio Gradle中没有Task任务&#xff0c;没有Assemble任务&#xff0c;不能方便导出aar包_gradle 没有task-CSDN博客 在as2024版本中&#xff0c;打开Setting…

DRAM CRC:让DDR5内存数据更靠谱

DRAM(动态随机存取存储器)是电脑内存的核心部件,负责存储和传输数据。如果数据在传输中出错,后果可能很严重,比如程序崩溃或者数据损坏。为了解决这个问题,DDR5内存引入了一个新功能,叫DRAM CRC(循环冗余校验)。简单来说,它是用来检查读写数据有没有问题的工具。 下面…

心率测量-arduino+matlab

参考&#xff1a;【教程】教你玩转Stduino之手指心跳检测模块 - 知乎 (zhihu.com) 1 原理 心跳检测模块&#xff0c;由一个红外线发射LED和红外接收器构成。手指心跳监测模块能够测量脉搏&#xff0c;是这样工作的&#xff1a;当手指放在发射器与接收器之间&#xff0c;红外发射…

H3C的MSTP+VRRP高可靠性组网技术(MSTP单域)

以下内容纯为博主分享自己的想法和理解&#xff0c;如有错误轻喷 MSTP多生成树协议可以基于不同实例实现不同VLAN之间的负载分担 VRRP虚拟路由器冗余协议可以提高网关的可靠性防止单点故障的可能 在以前这两种协议通常一起搭配组网&#xff0c;来提高网络的可靠性和稳定性&a…

字符串替换 (模拟)神奇数 (数学)DNA序列 (固定长度的滑动窗口)

⭐️个人主页&#xff1a;小羊 ⭐️所属专栏&#xff1a;每日两三题 很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~ 目录 字符串替换 &#xff08;模拟&#xff09;神奇数 &#xff08;数学&#xff09;DNA序列 &#xff08;固定长度的滑动窗口&am…

Linux驱动-块设备驱动

Linux驱动-块设备驱动 一&#xff0c;块设备驱动简介二&#xff0c;无请求队列情况&#xff08;EMMC和SD卡等&#xff09;三&#xff0c;请求队列情况&#xff08;磁盘等带有I/O调度的设备&#xff09;四&#xff0c;两者在驱动上区别 一&#xff0c;块设备驱动简介 块设备驱动…

【算法学习】链表篇:链表的常用技巧和操作总结

算法学习&#xff1a; https://blog.csdn.net/2301_80220607/category_12922080.html?spm1001.2014.3001.5482 前言&#xff1a; 在各种数据结构中&#xff0c;链表是最常用的几个之一&#xff0c;熟练使用链表和链表相关的算法&#xff0c;可以让我们在处理很多问题上都更加…

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定位、网络定位&#xff08;蜂窝基站、WLAN、蓝牙定位技术&#xff09;、地理编码、逆地理编码、国家码和地理围栏等基本功能。 使用位置服务时请打开设备“位置”开关。如果“位置”开关关闭并且代码未设置捕获异常&#xff0c;可能导致应用异常。 …

系统分析师(二)--操作系统

概述 进程管理 选项A&#xff1a;该进程中打开的文件 进程中打开的文件是由整个进程来管理的&#xff0c;同一进程下的各个线程都可以对这些打开的文件进行访问和操作&#xff0c;所以进程中打开的文件是可以被这些线程共享的。 选项B&#xff1a;该进程的代码段 进程的代码…

安科瑞测频仪表:新能源调频困局的破局者

安科瑞顾强 在“双碳”目标推动下&#xff0c;风电、光伏等新能源正加速成为电力供应的核心力量。然而&#xff0c;新能源发电的间歇性与波动性&#xff0c;如同一把“双刃剑”&#xff0c;在提供清洁电力的同时&#xff0c;也给电网稳定运行带来了前所未有的挑战。国家能源局…

富士相机照片 RAF 格式如何快速批量转为 JPG 格式教程

富士&#xff08;Fujifilm&#xff09;相机拍摄的 RAW 格式文件&#xff08;RAF&#xff09;因其高质量和丰富的图像信息而受到摄影师的喜爱。然而&#xff0c;RAF 文件通常体积较大且不易于分享或直接使用。为了方便处理&#xff0c;许多人选择将其转换为更通用的 JPG 格式。在…

Linux 入门指令(1)

&#xff08;1&#xff09;ls指令 ls -l可以缩写成 ll 同时一个ls可以加多个后缀 比如 ll -at (2)pwd指令 &#xff08;3&#xff09;cd指令 cd .是当前目录 &#xff08;4&#xff09;touch指令 &#xff08;5&#xff09;mkdir指令 &#xff08;6&#xff09;rmdir和rm…

Redis缓存数据库一致性

前言&#xff1a; 在系统开发中经常使用关系型数据库&#xff0c;为了提升关系型数据库的读性能&#xff0c;一般会使用redis加一层缓存&#xff0c;缓存和数据库是分离的两次操作&#xff0c;本文用来分析如何操作能保证缓存和数据库的数据一致性。 一、读场景 二、写场景 …

Android Coil 3 Fetcher大批量Bitmap拼接成1张扁平宽图,Kotlin

Android Coil 3 Fetcher大批量Bitmap拼接成1张扁平宽图&#xff0c;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移动文件或者目录&#xff0f;文件或者目录重命名 一、 tree命令 &#xff08;1&#xff09;定义 tree 命令可以以树状…

S32K144的m_data_2地址不够存,重新在LD文件中配置地址区域

在开发平台软件的时候代码中超出了64K的内存&#xff0c;单纯在ld文件中&#xff0c;增加m_data_2的存储长度&#xff0c;原先是0x00007000,我将长度修改为0x00008000,起始地址还是0x20000000,软件编译没有报错堆栈超出&#xff0c;但是软件下载到单片机中之后&#xff0c;144不…

【STM32】综合练习——智能风扇系统

目录 0 前言 1 硬件准备 2 功能介绍 3 前置配置 3.1 时钟配置 3.2 文件配置 4 功能实现 4.1 按键功能 4.2 屏幕功能 4.3 调速功能 4.4 倒计时功能 4.5 摇头功能 4.6 测距待机功能 0 前言 由于时间关系&#xff0c;暂停详细更新&#xff0c;本文章中&#xff0c;…

【重装系统】大白菜自制U盘装机,备份C盘数据,解决电脑启动黑屏/蓝屏

1. 准备 U 盘 U 盘容量至少 8G&#xff0c;备份 U 盘的数据&#xff08;后期会格式化&#xff09; 2. 从微软官网下载操作系统镜像 https://www.microsoft.com/zh-cn/software-download/windows11 3. 下载安装大白菜 https://www.alipan.com/s/33RVnKayUfY 4. 插入 U 盘&#…