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

分治-快排-215.数组中的第k个最大元素-力扣(LeetCode)

一、题目解析

1、需返回排序好的第k个最大元素

2、要求时间复杂度为O(N)

二、算法原理

解法1:堆排序(大根堆) k*O(N)

借用大堆的性质,将元素插入到大堆中,按照k输出堆顶第k个元素

解法2:堆排序(小根堆) (N-k)*O(logN)

先建k个小堆,然后插入元素,依次与堆顶元素比较,比堆顶元素大,则pop(删除堆顶元素)掉堆顶元素,插入nums[i],最终小堆中存储前k个最大的数

解法3:分治-快排 O(N)

基于数组分三块+随机数选择元素

通过埋下随机数种子srand(time(NULL)),rand() % (right-left+1) + left,找到随机数下标,得到基准元素key

由i移动遍历数组,left = -1,right = nums.size()+1,如果nums[i]<key,    swap(nums[i++],nums[++left]);如果nums[i] == key,i++;如果nums[i]>key,swap(nums[i],nums[--right])

依据排序好的数组,统计区间各个元素的个数判断情况

三、代码示例

解法1:

int findKthLargest(vector<int>& nums, int k){sort(nums.begin(),nums.end(),greater<int>());return nums[k-1];// O(N)//大堆priority_queue<int> pq(nums.begin(),nums.end());while(--k){pq.pop();}return pq.top();//K*logN}

解法2:

int findKthLargest(vector<int>& nums, int k){//小堆//(N-K)*logNpriority_queue<int,vector<int>,greater<int>> pq(nums.begin(),nums.begin()+k);//建k个数的小堆for(int i = k;i < nums.size();i++){if(nums[i] > pq.top()){pq.pop();pq.push(nums[i]);}}return pq.top();}

解法3:

int findKthLargest(vector<int>& nums, int k){//快排srand(time(NULL));return qsort(nums,0,nums.size()-1,k);}int qsort(vector<int>& nums,int l,int r,int k){if(l == r) return nums[l];//随机选择基准元素int key = getRandom(nums,l,r);//基准元素分三块int left = l-1,right = r+1,i = l;while(i<right){if(nums[i]<key) swap(nums[++left],nums[i++]);else if(nums[i] == key) i++;else swap(nums[i],nums[--right]);}//分情况讨论int c = r - right +1,b = right - left - 1;if(c>=k) return qsort(nums,right,r,k);else if(b+c>=k) return key;else return qsort(nums,l,left,k-b-c);}int getRandom(vector<int>& nums,int left,int right){return nums[rand() % (right - left + 1) + left];}

看到最后,如果对您有所帮助,还请点赞、收藏和关注,我们下期再见!

http://www.lryc.cn/news/613722.html

相关文章:

  • oracle-plsql理解和操作
  • 【MongoDB】查询条件运算符:$expr 和 $regex 详解,以及为什么$where和$expr难以使用索引
  • [Oracle] LEAST()函数
  • 经常问的14002
  • Kafka生产者事务机制原理
  • 前端单元测试最佳实践(一)
  • 前端开发(HTML,CSS,VUE,JS)从入门到精通!第八天(Vue框架及其安装)(完结篇) 重点 ! ! !
  • 基于Web的交互式坐标系变换矩阵计算工具
  • 【Linux】Linux增删改查命令大全(附频率评级)
  • vue3 map和filter功能 用法
  • Odoo 18 → Odoo 19 功能改动对比表
  • Vue3 基本语法
  • day21|学习前端vue3框架和ts语言
  • pdf文件转word免费使用几个工具
  • CSS BFC
  • webrtc弱网-EncodeUsageResource类源码分析及算法原理
  • Spring Security自动处理/login请求,后端控制层没有 @PostMapping(“/login“) 这样的 Controller 方法
  • 设计模式(二)——策略模式
  • 冠雅新品 | 以“无形之光”守护双眸,以“无声之智”浸润生活
  • 基于R语言,“上百种机器学习模型”学习教程 | Mime包
  • 【昇腾】Atlas 500 A2 智能小站制卡从M.2 SATA盘启动Ubuntu22.04系统,重新上电卡死没进系统问题处理_20250808
  • 主播生活模拟器2|主播人生模拟器2 (Streamer Life Simulator 2)免安装中文版
  • 31-数据仓库与Apache Hive-Insert插入数据
  • Pinterest视觉营销自动化:亚矩阵云手机实例与多分辨率适配技术
  • 远期(Forward)交易系统全球金融市场解决方案报告
  • 32-Hive SQL DML语法之查询数据
  • 《Hive、HBase、StarRocks、MySQL、OceanBase 全面对比:架构、优缺点与使用场景详解》
  • 安装部署K8S集群环境(实测有效版本)
  • K8s 常见故障案例分析
  • ArgoCD 与 GitOps:K8S 原生持续部署的实操指南