当前位置: 首页 > news >正文

大厂面试:找出数组中第k大的数的最佳算法

一.前置条件
假如数组为a,大小为n,要找到数组a中第k大的数。

二.解决方案
1.使用任意一种排序算法(例如快速排序)将数组a进行从大到小的排序,则第n-k个数即为答案。


2.构造一个长度为k的数组,将前k个数复制过来并降序排序。然后依次将 k+1 到 n 位的数分别插入 k 长度的数组中并保持数组长度为k且降序排列。最终长度为k的数组的最后一个元素即是答案。


3.将数组的所有元素构造一个大顶堆,然后删除堆顶元素k次并重新构成大顶堆,则第k次操作后的堆顶元素即为答案。
4.用快速排序的思想不把数组元素全排序的优化算法。
1)先看一下快速排序(降序排序)的算法。

/**
快速排序主函数
a:要排序的数组
left:排序数组左边界索引
right:排序数组右边界索引
*/
public void quickSort(int a[], int left, int right) {if (left < right) {//算出基准元素索引值indexint index = partition(a, left, right);//对低于index索引的数组递归排序quickSort(a, left, index - 1);//对高于index索引的数组递归排序quickSort(a, index + 1, right);}}//算出基准元素索引值,此索引值左侧值都大于基准元素值,此索引值右侧值都小于基准元素值
public int partition(int[] num, int left, int right) {if (num == null || num.length <= 0 || left < 0 || right >= num.length) {return 0;}//获取数组基准元素的下标int prio = num[left + (right - left) / 2]; //从两端交替向中间扫描    while (left <= right) {                 while (num[left] > prio)left++;while (num[right] < prio)right--;if (left <= right) {//将不符合条件的元素值交换位置并继续扫描swap(num, left, right);        left++;right--;}}return left;
}//交换元素
public void swap(int[] num, int left, int right) {int temp = num[left];num[left] = num[right];num[right] = temp;
}

2)我们选择数组区间 a[0…n-1]的中间位置的一个元素 a[n/2]作为 pivot,对数组 a[0…n-1]进行分区,这样数组就分成了三部分,a[0…p-1]、a[p]、a[p+1…n-1]。
如果 p+1=k,那 a[p]就是要求解的答案;如果 k>p+1, 说明第 k 大元素出现在 a[p+1…n-1]区间,我们再按照上面的思路递归的在 a[p+1…n-1]这个区间内查找。同理,如果 k<p+1,那就在 a[0…p-1]区间内递归查找。

3)所以改进后的代码如下:

public int quickSortKthLargest(int a[], int left, int right, int k) {if (left < right) {//算出基准元素索引值indexint index = partition(a, left, right);//索引对应的值就是第k大的数if(index+1==k){return a[index];}//在索引左边继续查找else if(index+1>k){return quickSortKthLargest(a, left, index-1, k);} //在索引右边继续查找else{return quickSortKthLargest(a, index+1, right, k);}}else{return -1;}}


5.在Python中,我们可以使用内置的heapq库来查找数组的第k大元素。heapq库实现了一个堆数据结构,我们可以利用堆的性质来找到数组的第k大元素。
代码如下:

# 返回第k大元素
def get_kth_largest(a, k): # heapq.nlargest(k, a)会返回数组a中最大的k个元素,# 然后我们通过[-1]来取得这k个元素中的最后一个,也就是第k大的元素。return heapq.nlargest(k, a)[-1]


6.使用最小堆来查找第k大的元素。
首先构建一个空的最小堆。遍历数组a,如果堆的大小小于k,我们就把当前元素加入堆中。如果堆的大小已经达到了k,我们就比较当前元素和堆顶元素(也就是堆中的最小元素),如果当前元素大于堆顶元素,我们就把堆顶元素替换为当前元素,再重新调整最小堆结构。这样,当遍历完整个数组后,堆顶元素就是数组的第k大元素(即是大小为k的最小堆(保存了数组中的最大的k个数)的最小元素)。
代码如下:

def get_kth_largest(a, k):  heap = []  for num in a:  # 若最小堆大小小于k,则将元素插入最小堆if len(heap) < k:  heapq.heappush(heap, num)  else:  # 若元素大于最小堆堆顶元素,则插入最小堆并重新排列if num > heap[0]:  heapq.heapreplace(heap, num)  # 堆顶元素即为数组的第k大元素return heap[0]  


致力于C、C++、Java、Kotlin、Android、Shell、JavaScript、TypeScript、Python等编程技术的技巧经验分享。

若作品对您有帮助,请关注、分享、点赞、收藏、在看、喜欢。您的支持是我们为您提供帮助的最大动力。

相关文章:

大厂面试:找出数组中第k大的数的最佳算法

一.前置条件 假如数组为a,大小为n&#xff0c;要找到数组a中第k大的数。 二.解决方案 1.使用任意一种排序算法&#xff08;例如快速排序&#xff09;将数组a进行从大到小的排序&#xff0c;则第n-k个数即为答案。 2.构造一个长度为k的数组&#xff0c;将前k个数复制过来并降序…...

爬取高校专业信息的Python爬虫简介与实践

1. 介绍 在当前高校专业信息繁多的情况下&#xff0c;选择适合自己的专业成为了许多学生面临的挑战。为了帮助学生更好地了解各高校专业情况&#xff0c;我们开发了一个Python爬虫程序&#xff0c;用于爬取高校专业信息并保存到Excel文件中。本文将详细介绍该爬虫的实现过程以…...

redis 集群模式(redis cluster)介绍

目录 一 redis cluster 相关定义 1&#xff0c; redis cluster 是什么 2&#xff0c;redis 集群的组成 3&#xff0c;集群的作用 4&#xff0c;集群架构图 二 Redis集群的数据分片 1&#xff0c;哈希槽是什么 2&#xff0c;哈希槽如何排布 3&#xff0c;Redis集…...

python实现网络爬虫

网络爬虫是一个自动从互联网上抓取数据的程序。Python有很多库可以帮助我们实现网络爬虫&#xff0c;其中最常用的是requests&#xff08;用于发送HTTP请求&#xff09;和BeautifulSoup&#xff08;用于解析HTML或XML文档&#xff09;。 以下是一个简单的Python网络爬虫示例&a…...

LeetCode 836. 矩形重叠

解题思路 相关代码 class Solution {public boolean isRectangleOverlap(int[] rec1, int[] rec2) {int x1 rec1[0];int y1 rec1[1];int x2 rec1[2];int y2 rec1[3];int a1 rec2[0];int b1 rec2[1];int a2 rec2[2];int b2 rec2[3];return Math.min(y2,b2)>Math.max…...

为说阿拉伯语的国家进行游戏本地化

阿拉伯语是由超过4亿人使用的语言&#xff0c;并且是二十多个国家的官方语言。进入这些国家的市场并非易事——虽然他们共享一种通用语言&#xff0c;但每个国家都有自己独特的文化&#xff0c;有自己的禁忌和对审查的处理方式。这就是为什么视频游戏公司长期以来都远离阿拉伯语…...

【Python系列】读取 Excel 第一列数据并赋值到指定列

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

二叉树——存储结构

二叉树的存储结构 二叉树一般可以使用两种结构存储&#xff0c;一种是顺序结构&#xff0c;另一种是链式结构。 一、顺序存储 二叉树的顺序存储是指用一组连续的存储单元依次自上而下、自左至右存储完全二叉树上的结点元素&#xff0c;即将完全二叉树上编号为i的结点元素存储…...

LangChain - OpenGPTs

文章目录 MessageGraph 消息图认知架构AssistantsRAGChatBot 持久化配置新模型新工具astream_events总结 关键链接&#xff1a; OpenGPT GitHub 存储库YouTube 上的 OpenGPT 演练LangGraph&#xff1a;Python、JS 两个多月前&#xff0c;在 OpenAI 开发日之后&#xff0c;我们…...

pe格式从入门到图形化显示(四)-节表

文章目录 前言一、什么是Windows PE格式节表&#xff1f;二、解析节表并显示1.节表数据结构以及字段描述2.节表的属性3.解析4.显示 前言 通过分析和解析Windows PE格式&#xff0c;并使用qt进行图形化显示 一、什么是Windows PE格式节表&#xff1f; PE格式的节表&#xff08…...

路由策略与路由控制之双点双向重发布(OSPF-ISIS)实验

双点双向重发布在路由协议中&#xff0c;特别是在OSPF&#xff08;开放式最短路径优先&#xff09;与IS-IS&#xff08;中间系统到中间系统&#xff09;等协议之间&#xff0c;指的是在两个协议间或者两个进程间进行路由信息共享的机制。这种机制涉及到在两个不同的协议区域使用…...

9proxy—数据采集工具全面测评

9Proxy数据采集工具Unlock the web with 9Proxy, the top residential proxy provider. Get unlimited bandwidth, affordable prices, and secure HTTPS and Socks5 configurations.https://9proxy.com/?utm_sourceblog&utm_mediumcsdn&utm_campaignyan 前言 在当今数…...

上海晶珩树莓派工业智能机械臂,亮相2024年embedded world博览会!

上海晶珩树莓派工业智能机械臂&#xff0c;亮相2024年embedded world博览会&#xff01; 工业智能机械臂是上海晶珩&#xff08;EDATEC&#xff09;团队基于树莓派工业相机ED-AIC2000和树莓派工业触摸屏ED-HMI2320开发的创新应用案例。 工业智能机械臂具备卓越的定位能力&…...

蓝桥杯——求和

题目 给定 n 个整数 a1, a2&#xff0c;…,an&#xff0c;求它们两两相乘再相加的和即: Sa1a2a1a3a1ana2a3 a&#xff08;n-2&#xff09;*an...a(n-1)*an 输入格式 输入的第一行包含一个整数 n。 第二行包含 几 个整数 a1,a2,,an。 输出格式 输出一个整数 S&#xff0c;表示所…...

设计模式:责任链模式示例

责任链模式可以应用于多种场景&#xff0c;下面是几个不同场景的例子&#xff0c;每个例子都包括完整的代码。 示例1&#xff1a;日志处理系统 在日志处理系统中&#xff0c;日志消息可以根据其严重性&#xff08;错误、警告、信息&#xff09;被不同级别的日志处理器处理。 …...

SpringBoot快速入门笔记(4)

文章目录 一、Vue框架1、前端环境准备2、简介3、快速开始4、事件绑定 二、Vue组件化开发1、NPM2、Vue Cli3、组件化开发4、SayHello自定义组件5、Movie自定义组件 一、Vue框架 1、前端环境准备 编码工具&#xff1a;VSCode 依赖管理&#xff1a;NPM 项目构建&#xff1a;VueCl…...

GoPro相机使用的文件格式和频率

打开GoPro相机(以11为例)&#xff0c;里面是一个DCIM文件夹。 DCIM是digital camera in memory 的简写&#xff0c;即存照片的文件夹&#xff0c;常见于数码相机、手机存储卡中的文件夹名字。 正常手机拍照和视频都是保存在此文件夹的。正常建议不用删&#xff0c;因为只要拍照…...

Redis Stack 安装部署

参考&#xff1a;Run Redis Stack on Docker | Redis Redis-stack 初体验_redis stack-CSDN博客 【docker】运行redis_docker run redis-stack-server requirepass-CSDN博客 Redis Stack 是一组软件套件&#xff0c;它主要由三部分组成。 一个是 Redis Stack Server&#x…...

【经典算法】LeetCode 5: 最长回文子串(Java/C/Python3实现含注释说明,Medium)

目录 题目描述思路及实现方式一&#xff1a;动态规划法思路代码实现Java版本C语言版本Python3版本 复杂度分析 方式二&#xff1a;中心扩展法思路代码实现Java版本C语言版本Python3版本 复杂度分析 总结相似题目 标签(题目类型)&#xff1a;回文串、动态规划 题目描述 给定一…...

39.Python从入门到精通—parseString 方法 Python 解析XML实例 使用xml.dom解析xml

39.Python从入门到精通—parseString 方法 Python 解析XML实例 使用xml.dom解析xml parseString 方法Python 解析XML实例使用xml.dom解析xml parseString 方法 parseString 方法是 Python 标准库中 xml.dom.minidom 模块中的一个函数&#xff0c;用于解析 XML 字符串并构建 DO…...

用Python复现FAST天眼数学建模:从坐标变换到促动器伸缩量计算(附完整代码)

用Python复现FAST天眼数学建模&#xff1a;从坐标变换到促动器伸缩量计算&#xff08;附完整代码&#xff09; 中国天眼FAST作为全球最大单口径射电望远镜&#xff0c;其主动反射面调节系统堪称现代工程奇迹。当观测不同方位天体时&#xff0c;需要通过促动器精确控制4450块反射…...

从零到一:Android Studio集成Uniapp离线SDK打包实战

1. 环境准备&#xff1a;工具选择与版本匹配 第一次接触Uniapp离线打包时&#xff0c;最让我头疼的就是工具版本匹配问题。记得去年接手一个混合开发项目时&#xff0c;因为HBuilderX和SDK版本不兼容&#xff0c;整整浪费了两天时间排查问题。为了避免大家重蹈覆辙&#xff0c…...

编程统计公司内部资料查阅使用数据,优化资料分类存储方式。提升职场员工工作查阅办事效率。

构建一个公司内部资料查阅使用统计与资料分类存储优化的商务智能示例项目&#xff0c;去营销化、中立化&#xff0c;仅用于学习与工程实践参考。一、实际应用场景描述在中大型企业中&#xff0c;内部资料&#xff08;制度、流程文档、技术手册、项目档案&#xff09;数量庞大&a…...

【避坑指南】VSCode+EIDE+Keil混合开发环境:从零搭建到项目无缝迁移

1. 为什么需要VSCodeEIDEKeil混合开发环境&#xff1f; 作为一名嵌入式开发者&#xff0c;我深知Keil这个老牌IDE在开发效率上的痛点&#xff1a;代码补全弱、界面老旧、多窗口管理混乱。但直接完全迁移到VSCode又面临工程兼容性问题&#xff0c;特别是对传统AC5编译器的支持。…...

高效视频帧提取终极指南:为深度学习构建专业数据集

高效视频帧提取终极指南&#xff1a;为深度学习构建专业数据集 【免费下载链接】video2frame Yet another easy-to-use tool to extract frames from videos, for deep learning and computer vision. 项目地址: https://gitcode.com/gh_mirrors/vi/video2frame 在计算机…...

Arm Cortex-X2/X3架构解析与性能优化实践

1. Arm Cortex-X2/X3集群架构概述在Armv9架构的高性能计算领域&#xff0c;Cortex-X2和X3代表了当前最先进的CPU设计理念。作为DynamIQ共享单元(DSU)的核心组件&#xff0c;它们通过可配置的缓存层次结构和智能一致性协议&#xff0c;为现代异构计算提供了灵活的解决方案。1.1 …...

3个维度深度解析:UABEA如何重塑Unity资源处理生态

3个维度深度解析&#xff1a;UABEA如何重塑Unity资源处理生态 【免费下载链接】UABEA c# uabe for newer versions of unity 项目地址: https://gitcode.com/gh_mirrors/ua/UABEA 在Unity游戏开发和资源处理的复杂生态中&#xff0c;开发者常常面临一个核心挑战&#xf…...

【C语言】printf格式化输出:你真的理解“四舍五入”的陷阱吗?

1. 从printf的"四舍五入"陷阱说起 那天我在调试一个财务计算程序时&#xff0c;发现金额显示总差那么几分钱。比如3.145元应该显示为3.15&#xff0c;但程序输出却是3.14。这让我想起刚学C语言时踩过的坑——printf的格式化输出并不像数学课教的四舍五入那样简单。 先…...

Nixtla时间序列预测生态:从统计模型到深度学习的统一实践

1. 项目概述&#xff1a;时间序列预测的“瑞士军刀”如果你正在处理时间序列数据&#xff0c;无论是销售预测、服务器监控、还是能源消耗分析&#xff0c;那么你很可能听说过或正在使用一些经典的库&#xff0c;比如statsmodels、prophet&#xff0c;或者更现代的深度学习框架。…...

Faderwave合成器设计:从波形塑造到数字滤波的嵌入式音频实践

1. 项目概述&#xff1a;从推子到声音&#xff0c;Faderwave合成器的设计哲学如果你玩过硬件合成器&#xff0c;或者对数字音频合成感兴趣&#xff0c;那你肯定知道&#xff0c;声音设计的起点往往是一个简单的波形。但如何让这个波形“活”起来&#xff0c;变成你脑海中那个独…...