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

分治-快排-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.xdnf.cn/news/17239.html

相关文章:

  • 【Linux】从零开始:RPM 打包全流程实战万字指南(含目录结构、spec 编写、分步调试)
  • Android 的CameraX的使用(配置,预览,拍照,图像分析,录视频)
  • 使用Python提取PDF大纲(书签)完整指南
  • 持中文的 TXT 合并 PDF 工具 —— GUI + ReportLab 实战
  • Emacs 折腾日记(二十九)—— 打造C++ IDE
  • 使用 Grunt 替换 XML 文件中的属性值
  • 亚马逊跨类目铺货广告运营:从粗放投放to智能提效的省力法则
  • iOS混淆工具有哪些?跨平台 App 混淆与保护的实用方案
  • 零基础深度学习规划路线:从数学公式到AI大模型的系统进阶指南
  • 基于linux环境在centos7上部署gitlab
  • Claude Code 实战场景解析:从代码生成到系统重构的典型应用案例
  • 【类与对象(中)】C++类默认成员函数全解析
  • 智慧农业温室大棚物联网远程监控与智能监测系统
  • 一站式体育赛事平台源码解决方案
  • 虚拟机Ubuntu图形化界面root用户登录错误
  • 用 Go 写个极简反向代理,把 CC 攻击挡在业务容器之外
  • 设计模式(二)——策略模式
  • ABP VNext + Fody AOP:编译期织入与性能监控
  • JDK、eclipse的安装,配置JDK、Tomcat并使用eclipse创建项目
  • 为什么提升模型尺度可以提升模型的CoT能力
  • 人工智能基础知识笔记十五:文本分块(Chunk)
  • React+TypeScript代码注释规范指南
  • 【JMeter】调试取样器的使用
  • 【性能测试】-2- JMeter工具的使用
  • c++注意点(15)----设计模式(桥接模式与适配器模式)
  • 深入理解VideoToolbox:iOS/macOS视频硬编解码实战指南
  • TDSQL GTS文件说明
  • cAdvisor 容器监控软件学习
  • Pygame音频播放的最简框架代码示例
  • Java选手如何看待Golang