尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

数组中的第K大元素

数组中的第K大元素
📅 发布时间:2026/6/19 21:17:58

题目描述:给一个整数数组和一个正整数K,返回数组中第K大的元素。

思路1:堆排序(优先队列)

维护一个小顶堆,堆的大小限制为K,堆里面装的元素就是当前数组中前K大的元素。

这个思路非常简单,用STL的priority_queue直接就解决了,不需要过多阐述。

注意:priority_queue默认是大顶堆,也就是top()返回最大值,需要用greater<>改成小顶堆。

时间复杂度:\(O(NlogK)\)

int findKthLargest(vector<int>& nums, int k) {priority_queue<int, vector<int>, greater<int>> pq;int n = nums.size();for(int i=0; i<n; ++i){pq.push(nums[i]);if(pq.size() > k){pq.pop();}}return pq.top();
}

思路2:快速选择(快速排序改)

基于优先队列的方法并不是时间最优的。事实上我们可以做到时间复杂度期望为\(O(N)\)的方法,以下是参考力扣215题解的分析:

我们先来回顾快速排序,我们对数组 \(a[l⋯r]\) 做快速排序的过程是:

  1. 划分: 将数组 \(a[l⋯r]\) 「划分」成两个子数组 \(a[l⋯q−1]\)、\(a[q+1⋯r]\),使得 \(a[l⋯q−1]\) 中的每个元素小于等于 \(a[q]\),且 \(a[q]\) 小于等于 \(a[q+1⋯r]\) 中的每个元素。其中,计算下标 \(q\) 也是「划分」过程的一部分。

  2. 解决: 通过递归调用快速排序,对子数组 \(a[l⋯q−1]\) 和 \(a[q+1⋯r]\) 进行排序。

  3. 合并: 因为子数组都是原址排序的,所以不需要进行合并操作,\(a[l⋯r]\) 已经有序。

由此可以发现每次经过「划分」操作后,我们一定可以确定一个元素的最终位置,即 \(x\) 的最终位置为 \(q\),并且保证 \(a[l⋯q−1]\) 中的每个元素小于等于 \(a[q]\),且 \(a[q]\) 小于等于 \(a[q+1⋯r]\) 中的每个元素。所以只要某次划分的 \(q\) 为倒数第 \(k\) 个下标的时候,我们就已经找到了答案。 我们只关心这一点,至于 \(a[l⋯q−1]\) 和 \(a[q+1⋯r]\) 是否是有序的,我们不关心。

因此我们可以改进快速排序算法来解决这个问题:在分解的过程当中,我们会对子数组进行划分,如果划分得到的 \(q\) 正好就是我们需要的下标,就直接返回 \(a[q]\);否则,如果 \(q\) 比目标下标小,就递归右子区间,否则递归左子区间。这样就可以把原来递归两个区间变成只递归一个区间,提高了时间效率。这就是“快速选择”算法。

我们使用双指针法的快排,可以有效应对各种数据:

int qSelect(vector<int>& nums, int l, int r, int k){if(l == r){return nums[k];}int partition = nums[l];int lp = l - 1, rp = r + 1;while(lp < rp){do{lp++;}while(nums[lp] < partition);do{rp--;}while(nums[rp] > partition);if(lp < rp){swap(nums[lp], nums[rp]);}}if(k <= rp){return qSelect(nums, l, rp, k);}else{return qSelect(nums, rp+1, r, k);}
}
int findKthLargest(vector<int>& nums, int k) {int n = nums.size();return qSelect(nums, 0, n-1, n-k);
}

相关新闻

  • Gitee:本土开发者生态的崛起与数字化转型新范式
  • 【2025-09-11】脆弱的睡眠
  • HC32F460串口重定向printf

最新新闻

  • 修复kkFileView XSS漏洞与POI文件预览兼容性问题实战
  • 弱监督学习与概率提示技术在3D目标检测中的应用
  • Hoppscotch自托管部署与API自动化测试实战指南
  • Qwen3.6-A3B:面向本地Agent的MoE实时推理引擎解析
  • 微信防撤回失效?RevokeMsgPatcher 2.0 技术原理与实战指南
  • 普宁连锁眼镜店哪家靠谱|自营和加盟的本质区别是什么 - 品牌观察

日新闻

  • 5分钟掌握Python进化算法:Geatpy高性能优化工具完全指南
  • Microchip 24AA044 EEPROM选型与应用全指南:从参数解析到实战编程
  • 华为的鸿蒙到底有多牛?为什么称作遥遥领先?

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号