数组中的第K个最大元素
在未排序的数组中找到第 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:堆排序
- class Solution {
- public:
- int findKthLargest(vector<int>& nums, int k) {
- if(nums.empty()||k<=0||nums.size()<k)
- return ;
- make_heap(nums.begin(),nums.end());
- while(k!=)
- {
- pop_heap(nums.begin(),nums.end());
- nums.pop_back();
- --k;
- }
- return nums[];
- }
- };
code2: bfprt
- class Solution {
- public:
- int findKthLargest(vector<int>& nums, int k) {
- if(nums.empty()||k<||k>nums.size())
- return ;
- vector<int> tmp(nums.begin(),nums.end());
- return bfprt(tmp,,tmp.size()-,tmp.size()-k);
- }
- private:
- int bfprt(vector<int>& arr,int left,int right,int k)
- {
- if(left==right)
- return arr[left];
- //1.得到中位数
- int pivot=getMedian(arr,left,right);
- //2.根据中位数划分左右区间
- vector<int> pivotRange=_partition(arr,left,right,pivot);
- //3.找到中位数排序后的位置,判断k是不是中位数所在的下标范围内,如果在就找到了
- if(k>=pivotRange[]&&k<=pivotRange[])
- return arr[k];
- else if(k<pivotRange[])
- return bfprt(arr,left,pivotRange[]-,k);
- else /*if(k>pivotRange[1])*/
- return bfprt(arr,pivotRange[]+,right,k);
- }
- int getMedian(vector<int>& arr,int left,int right)
- {
- int nums=right-left+;
- int offset=nums%==?:;//每五个为一组,求每组的中位数,放在中位数数组中
- vector<int> midArr(nums/+offset);//中位数数组
- for(int i=;i<midArr.size();++i)
- {
- int l=left+i*;
- int r=l+;
- midArr[i]=getMedianCore(arr,l,min(r,right));
- }
- //找中位数组的中位数
- return bfprt(midArr,,midArr.size()-,midArr.size()/);
- }
- int getMedianCore(vector<int>& arr, int left, int right)
- {
- //中位数组排序,返回中间数
- sort(arr.begin()+left,arr.begin()+right+);
- return arr[(left+right)/+(left+right)%];//奇数和偶数情况
- }
- vector<int> _partition(vector<int>& arr,int left,int right,int pivot)
- {
- int small=left-;
- int big=right+;
- int cur=left;
- while(cur<big)
- {
- if(arr[cur]<pivot)
- swap(arr[++small],arr[cur++]);
- else if(arr[cur]>pivot)
- swap(arr[cur],arr[--big]);
- else
- ++cur;
- }
- vector<int> tmp{small+,big-};
- return tmp;
- }
- };
数组中的第K个最大元素的更多相关文章
- 寻找数组中的第K大的元素,多种解法以及分析
遇到了一个很简单而有意思的问题,可以看出不同的算法策略对这个问题求解的优化过程.问题:寻找数组中的第K大的元素. 最简单的想法是直接进行排序,算法复杂度是O(N*logN).这么做很明显比较低效率,因 ...
- LeetCode:数组中的第K个最大元素【215】
LeetCode:数组中的第K个最大元素[215] 题目描述 在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: ...
- LeetCode215. 数组中的第K个最大元素
215. 数组中的第K个最大元素 问题描述 在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 示例 1: 输入: [3 ...
- LeetCode 215——数组中的第 K 个最大元素
1. 题目 在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 k = 2 ...
- 代码题(3)— 最小的k个数、数组中的第K个最大元素、前K个高频元素
1.题目:输入n个整数,找出其中最小的K个数. 例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4. 快排思路(掌握): class Solution { public ...
- Leetcode 215.数组中的第k个最大元素
数组中的第k个最大元素 在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 ...
- Leetcode题目215.数组中的第K个最大元素(中等)
题目描述: 在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 k = 2 ...
- Java实现 LeetCode 215. 数组中的第K个最大元素
215. 数组中的第K个最大元素 在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6 ...
- 215. 数组中的第K个最大元素 + 快速排序 + 大根堆
215. 数组中的第K个最大元素 LeetCode-215 另一道类似的第k大元素问题:https://www.cnblogs.com/GarrettWale/p/14386862.html 题目详情 ...
- 数组中的第K个最大元素leetcode(Top K的问题)
在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 k = 2 输出: 5 ...
随机推荐
- WebShell代码分析溯源(四)
WebShell代码分析溯源(四) 一.一句话变形马样本 <?php @$_++;$__=("`"^"?").(":"^"} ...
- 操作MyBatis引发Error setting null for parameter #X with JdbcType OTHER .无效的列类型
再用MyBatis操作Oracle的时候,传入null值而引发的错误 异常信息: org.springframework.jdbc.UncategorizedSQLException: Error s ...
- js中cookie设置、获取与清除
// 设置cookie setCookie (cname, cpwd, exdays) { var exdate = new Date()// 获取时间 exdate.setTime(exdate.g ...
- 一个神奇的HTML标签-----marquee
今天无意中发现了一个html标签 - <marquee></marquee>可以实现多种滚动效果,无需js控制. 语法:<marquee>...</marqu ...
- oracle截取时间的年/月/日/时/分/秒
修改日期格式为年月日时分秒: alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';select to_char(sysdate,'yyy ...
- 寝室远程连接室友mysql数据库
注意,本方法是适用于同一局域网下的远程连接 注意,本方法是适用于同一局域网下的远程连接 注意,本方法是适用于同一局域网下的远程连接 首先需要修改mysql数据库的相关配置,将user表中的host改为 ...
- 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 ...
- Linux系统学习 十、DHCP服务器—介绍和原理
介绍: DHCP服务作用(动态主机配置协议) 为大量客户机自动分配地址.提供几种管理 减轻管理和维护成本.提高网络配置效率 可分配的地址信息主要包括: 网卡的IP地址.子网掩码 对应的网路地址.广播地 ...
- SpringBoot开发准备工作,保存备用,
application.properties server.port=8080 spring.thymeleaf.prefix = classpath:/static/ spring.thymelea ...
- VirtualBox中重建Host-Only网卡后无法启动虚拟机
问题: 在删除原有VirtualBox Host-Only虚拟网卡并重新添加后,虚拟机可能会无法启动,出现以下错误 Failed to open/create the internal network ...