在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。

示例 1:

输入: [3,2,1,5,6,4] 和 k = 2
输出: 5
示例 2:

输入: [3,2,3,1,2,4,5,5,6] 和 k = 4
输出: 4
说明:

你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度。

code1:堆排序

  1. class Solution {
  2. public:
  3. int findKthLargest(vector<int>& nums, int k) {
  4. if(nums.empty()||k<=0||nums.size()<k)
  5. return ;
  6.  
  7. make_heap(nums.begin(),nums.end());
  8. while(k!=)
  9. {
  10. pop_heap(nums.begin(),nums.end());
  11. nums.pop_back();
  12. --k;
  13. }
  14. return nums[];
  15. }
  16. };

code2: bfprt

  1. class Solution {
  2. public:
  3. int findKthLargest(vector<int>& nums, int k) {
  4. if(nums.empty()||k<||k>nums.size())
  5. return ;
  6.  
  7. vector<int> tmp(nums.begin(),nums.end());
  8. return bfprt(tmp,,tmp.size()-,tmp.size()-k);
  9. }
  10. private:
  11. int bfprt(vector<int>& arr,int left,int right,int k)
  12. {
  13. if(left==right)
  14. return arr[left];
  15.  
  16. //1.得到中位数
  17. int pivot=getMedian(arr,left,right);
  18. //2.根据中位数划分左右区间
  19. vector<int> pivotRange=_partition(arr,left,right,pivot);
  20. //3.找到中位数排序后的位置,判断k是不是中位数所在的下标范围内,如果在就找到了
  21. if(k>=pivotRange[]&&k<=pivotRange[])
  22. return arr[k];
  23. else if(k<pivotRange[])
  24. return bfprt(arr,left,pivotRange[]-,k);
  25. else /*if(k>pivotRange[1])*/
  26. return bfprt(arr,pivotRange[]+,right,k);
  27. }
  28. int getMedian(vector<int>& arr,int left,int right)
  29. {
  30. int nums=right-left+;
  31. int offset=nums%==?:;//每五个为一组,求每组的中位数,放在中位数数组中
  32. vector<int> midArr(nums/+offset);//中位数数组
  33. for(int i=;i<midArr.size();++i)
  34. {
  35. int l=left+i*;
  36. int r=l+;
  37. midArr[i]=getMedianCore(arr,l,min(r,right));
  38. }
  39. //找中位数组的中位数
  40. return bfprt(midArr,,midArr.size()-,midArr.size()/);
  41. }
  42. int getMedianCore(vector<int>& arr, int left, int right)
  43. {
  44. //中位数组排序,返回中间数
  45. sort(arr.begin()+left,arr.begin()+right+);
  46. return arr[(left+right)/+(left+right)%];//奇数和偶数情况
  47. }
  48. vector<int> _partition(vector<int>& arr,int left,int right,int pivot)
  49. {
  50. int small=left-;
  51. int big=right+;
  52. int cur=left;
  53. while(cur<big)
  54. {
  55. if(arr[cur]<pivot)
  56. swap(arr[++small],arr[cur++]);
  57. else if(arr[cur]>pivot)
  58. swap(arr[cur],arr[--big]);
  59. else
  60. ++cur;
  61. }
  62. vector<int> tmp{small+,big-};
  63. return tmp;
  64. }
  65. };

数组中的第K个最大元素的更多相关文章

  1. 寻找数组中的第K大的元素,多种解法以及分析

    遇到了一个很简单而有意思的问题,可以看出不同的算法策略对这个问题求解的优化过程.问题:寻找数组中的第K大的元素. 最简单的想法是直接进行排序,算法复杂度是O(N*logN).这么做很明显比较低效率,因 ...

  2. LeetCode:数组中的第K个最大元素【215】

    LeetCode:数组中的第K个最大元素[215] 题目描述 在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: ...

  3. LeetCode215. 数组中的第K个最大元素

    215. 数组中的第K个最大元素 问题描述 在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 示例 1: 输入: [3 ...

  4. LeetCode 215——数组中的第 K 个最大元素

    1. 题目 在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 k = 2 ...

  5. 代码题(3)— 最小的k个数、数组中的第K个最大元素、前K个高频元素

    1.题目:输入n个整数,找出其中最小的K个数. 例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4. 快排思路(掌握): class Solution { public ...

  6. Leetcode 215.数组中的第k个最大元素

    数组中的第k个最大元素 在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 ...

  7. Leetcode题目215.数组中的第K个最大元素(中等)

    题目描述: 在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 k = 2 ...

  8. Java实现 LeetCode 215. 数组中的第K个最大元素

    215. 数组中的第K个最大元素 在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6 ...

  9. 215. 数组中的第K个最大元素 + 快速排序 + 大根堆

    215. 数组中的第K个最大元素 LeetCode-215 另一道类似的第k大元素问题:https://www.cnblogs.com/GarrettWale/p/14386862.html 题目详情 ...

  10. 数组中的第K个最大元素leetcode(Top K的问题)

    在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 k = 2 输出: 5 ...

随机推荐

  1. WebShell代码分析溯源(四)

    WebShell代码分析溯源(四) 一.一句话变形马样本 <?php @$_++;$__=("`"^"?").(":"^"} ...

  2. 操作MyBatis引发Error setting null for parameter #X with JdbcType OTHER .无效的列类型

    再用MyBatis操作Oracle的时候,传入null值而引发的错误 异常信息: org.springframework.jdbc.UncategorizedSQLException: Error s ...

  3. js中cookie设置、获取与清除

    // 设置cookie setCookie (cname, cpwd, exdays) { var exdate = new Date()// 获取时间 exdate.setTime(exdate.g ...

  4. 一个神奇的HTML标签-----marquee

    今天无意中发现了一个html标签 - <marquee></marquee>可以实现多种滚动效果,无需js控制. 语法:<marquee>...</marqu ...

  5. oracle截取时间的年/月/日/时/分/秒

    修改日期格式为年月日时分秒: alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';select to_char(sysdate,'yyy ...

  6. 寝室远程连接室友mysql数据库

    注意,本方法是适用于同一局域网下的远程连接 注意,本方法是适用于同一局域网下的远程连接 注意,本方法是适用于同一局域网下的远程连接 首先需要修改mysql数据库的相关配置,将user表中的host改为 ...

  7. Test Case:: 12C ASMCMD New feature (Doc ID 1589249.1)

    Test Case:: 12C ASMCMD New feature (Doc ID 1589249.1) APPLIES TO: Oracle Database - Enterprise Editi ...

  8. Linux系统学习 十、DHCP服务器—介绍和原理

    介绍: DHCP服务作用(动态主机配置协议) 为大量客户机自动分配地址.提供几种管理 减轻管理和维护成本.提高网络配置效率 可分配的地址信息主要包括: 网卡的IP地址.子网掩码 对应的网路地址.广播地 ...

  9. SpringBoot开发准备工作,保存备用,

    application.properties server.port=8080 spring.thymeleaf.prefix = classpath:/static/ spring.thymelea ...

  10. VirtualBox中重建Host-Only网卡后无法启动虚拟机

    问题: 在删除原有VirtualBox Host-Only虚拟网卡并重新添加后,虚拟机可能会无法启动,出现以下错误 Failed to open/create the internal network ...