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

数组中的第K个最大元素

题目:
在这里插入图片描述
思考1:

  1. 使用堆排序实现
  2. 堆排序有两种思路:
    1. 使用大根堆,将数组所有元素使用大根堆建堆,使用k-1次堆的删除操作后的堆顶就是索要元素
    2. 使用小根堆,将数组前k个元素建立小根堆,遍历数组中其他元素,若遍历到的元素大于堆顶则删除堆顶并将该遍历到的元素加入堆中(也就是说始终维持一个大小k的小根堆,小根堆里面存储的元素随着遍历过程的进行会不断更新成较大的元素),遍历完成后堆顶就是第k大元素(k-1个更大的元素都在堆里面了)-----比起大根堆法省下一些空间~~

实现采用小根堆方法:

class Solution {
public:void adjust(vector<int>& heap,int t){int max=t;while(2*max+1<heap.size()){int l=2*max+1;int r=2*max+2;if (r<heap.size()){if (heap[l]<heap[r]){if (heap[l]<heap[max]){swap(heap[l],heap[max]);max=l;}else {break;}}else{if (heap[r]<heap[max]){swap(heap[r],heap[max]);max=r;}else{break;}}}else{if (heap[l]<heap[max]){swap(heap[l],heap[max]);max=l;}else {break;}}}}int findKthLargest(vector<int>& nums, int k) {vector<int> heap(nums.begin(),nums.begin()+k);int max=k/2-1;for (int i=max;i>=0;--i){adjust(heap,i);}for (int i=k;i<nums.size();i++){if (nums[i]>heap[0]){heap[0]=nums[i];adjust(heap,0);}}return heap[0];}
};

思考二:

  1. 虽说堆排序的思考和实现已经蛮好的了,但仍然未满足要求
  2. 对于时间复杂度低的排序,想到快速排序的基于哨兵+划分的思路,由于并不需要完全排序整个数组,可以根据哨兵和k的位置进行快速选择定位,显著降低时间复杂度
  3. 注意巨坑(普通划分会有很多重复元素不特殊处理会导致超时的)-----》三路划分

实现:

class Solution {
public:int findKthLargest(vector<int>& nums, int k) {return quickSelect(nums, 0, nums.size() - 1, k);}private:int quickSelect(vector<int>& nums, int left, int right, int k) {if (left == right) return nums[left]; int pivotIndex = left + rand() % (right - left + 1);int pivot = nums[pivotIndex];int i = left, j = right, p = left;while (p <= j) {if (nums[p] > pivot) {swap(nums[p], nums[i]);i++;p++;} else if (nums[p] < pivot) {swap(nums[p], nums[j]);j--;} else {p++;}}int bigCount = i - left;int equalCount = j - i + 1;if (k <= bigCount) {return quickSelect(nums, left, i - 1, k);} else if (k <= bigCount + equalCount) {return pivot; } else {return quickSelect(nums, j + 1, right, k - bigCount - equalCount);}}
};
http://www.lryc.cn/news/616378.html

相关文章:

  • MyBatisPlus插件原理
  • Leetcode 3646. Next Special Palindrome Number
  • 代码随想录算法训练营第六十天|图论part10
  • 【Nginx②】 | Nginx部署前端静态文件指南(基于虚拟机环境)
  • 浏览器CEFSharp88+X86+win7 之多页面展示(四)
  • NodeJs学习日志(4):路由合并_环境配置_常用文件目录
  • element-ui el-progress在有小数的情况下,会换行显示。解决不换行的问题。
  • iceberg安装部署
  • Rust面试题及详细答案120道(11-18)-- 控制流与函数
  • vulnhub-Drippingblues靶机
  • 通过Certbot自动申请更新HTTPS网站的SSL证书
  • 瑞芯微 RK3588 平台驱动开发 学习计划
  • CST支持对哪些模型进行特征模仿真?分别有哪些用于特征模分析的求解器?
  • C语言——深入理解指针(二)
  • 【东枫科技】FR3 可扩展测试平台,适用于 6G 研究与卫星通信,高达 1.6 GHz 的带宽
  • 【秋招笔试】2025.08.09美团秋招算法岗机考真题-第三题
  • Python 的浅拷贝 vs 深拷贝(含嵌套可变对象示例与踩坑场景)
  • OpenGL VAO 概念、API 和示例
  • 每日一题:使用栈实现逆波兰表达式求值
  • TypeScript中的type和interface的区别是什么?
  • 从街亭失守看管理
  • WAV音频数据集MFCC特征提取处理办法
  • 【MySQL——第三章 :MySQL库表操作】
  • 如何选择适合自己电商业务的 API?​
  • DBAPI 实现不同角色控制查看表的不同列
  • 七、CV_模型微调
  • 使用快捷键将当前屏幕内容滚动到边缘@首行首列@定位到第一行第一个字符@跳转到4个角落
  • Knuth‘s TwoSum Algorithm 原理详解
  • 每日任务day0810:小小勇者成长记之武器精炼
  • 机器学习 DBScan