寻找第K大(基于快排)
描述
有一个整数数组,请你根据快速排序的思路,找出数组中第 k 大的数。
给定一个整数数组 a ,同时给定它的大小n和要找的 k ,请返回第 k 大的数(包括重复的元素,不用去重),保证答案存在。
要求:时间复杂度 O(nlogn)O(nlogn),空间复杂度 O(1)O(1)
示例1
输入:
[1,3,5,2,2],5,3返回值:
2
示例2
输入:
[10,10,9,9,8,7,5,6,4,3,4,2],12,3返回值:
9说明:去重后的第3大是8,但本题要求包含重复的元素,不用去重,所以输出9
快速排序:C++
vector<int>quickSort(vector<int>& nums, int start, int end) {if (start >= end)return nums;int base = nums[start];int i = start;int j = end;while (i < j) {while (i < j && nums[j] >= base)j--;swap(nums[i], nums[j]);while (i < j && nums[i] <= base)i++;swap(nums[i], nums[j]);}quickSort(nums, start, i - 1);quickSort(nums, i + 1, end);return nums;
}
采用快排思想:base右边元素个数超过K,结果肯定在右边
class Solution {
public:vector<int> quickSort(vector<int>&nums, int start, int end, int K){if (start >= end) return nums;int randPos = rand() % (end - start + 1) + start;//随机化寻找base元素,以免时间复杂度退化到 O(N^2)swap(nums[start], nums[randPos]);int base = nums[start];int i = start;int j = end;while (i < j){while (i < j && nums[j] >= base) j--; //从右往左,寻找比base小的数swap(nums[i], nums[j]);while (i < j && nums[i] <= base) i++;swap(nums[i], nums[j]);}if(nums.size()-i<K) //如果base右边的数超过K个,则第K大数肯定在base右边,此时就不需要对base左边的进行排序quickSort(nums, start, i - 1, K);quickSort(nums, i + 1, end, K);return nums;}int findKth(vector<int> a, int n, int K) {quickSort(a, 0, n-1, K);return a[n-K];}
};
寻找第K大(基于快排)相关推荐
- ACdream 1099——瑶瑶的第K大——————【快排舍半,输入外挂】
瑶瑶的第K大 Time Limit:2000MS Memory Limit:128000KB 64bit IO Format:%lld & %llu Submit Status ...
- 面试官:海量无序数据,寻找第 K 大的数,越快越好
最近在参加阿里云举办的<第三届数据库大赛创新上云性能挑战赛--高性能分析型查询引擎赛道>,传送门: https://tianchi.aliyun.com/competition/entra ...
- 海量无序数据寻找第 K 大的数
前言 最近在参加阿里云举办的<第三届数据库大赛创新上云性能挑战赛--高性能分析型查询引擎赛道>,传送门:https://tianchi.aliyun.com/competition/ent ...
- 牛客题霸 [寻找第K大] C++题解/答案
牛客题霸 [寻找第K大] C++题解/答案 题目描述 有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数. 给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的 ...
- [C++日常小题] 寻找第k大数字(numberk)
Description 经过长时间的筹备工作,在Jourk,Ronny,Plipala,阿长,阿沈等人的努力下,DM实验室建立起自己的系列网站,其中包括三个大板块:DMOJ首页.DMOJ论坛.DMOJ ...
- java中二叉树中第k大的数,寻找第k大的数
目录: 1.引子 2.排序解决法 3.类快排解法 4.最小堆解法 1.引子 日常编码中,常见遇到这样的问题,"寻找最大的数",此问题非常容易,可暴力直接遍历找出,也可使用分冶策略找 ...
- 寻找第K大元素的八大算法、源码及拓展
寻找第K大元素的八大算法.源码及拓展 http://www.cnblogs.com/bethunebtj/p/4861378.html 一.问题描述 所谓"第(前)k大数问题"指的 ...
- 寻找第K大 --- 牛客网
寻找第K大 题目链接 描述 代码 题目链接 https://www.nowcoder.com/questionTerminal/e016ad9b7f0b45048c58a9f27ba618bf 描述 ...
- 46最小的k个数 47寻找第k大
46 最小的k个数 第一反应排序的话是O(nlogn),暴力是O(NK),看了题解用优先队列,因为优先队列插入元素需要logn,我们只要让堆的大小控制在k,插入一个元素就值需要logk,这样整体的时间 ...
- 快速排序 寻找第K大的数
对于海量不确定数据,可采用维护大小为K的最小堆不断更新前K大的数 但对于数量有限的数组,可采用快速排序的思想寻找第K大的数,时间复杂度为O(lgN) 即快排之后, 若K刚好为基准点下标,那么返回基准点 ...
最新文章
- 基于深度学习的文本数据特征提取方法之Glove和FastText
- adobe仿宋std r常规_宜春MF4003-5-06-CV-R气体质量流量计
- 开放下载!解锁 Serverless 从入门到实战大“橙”就
- VSAN见证虚拟设备
- 虚无鸿蒙哪个厉害,【图说鸿蒙】鸿蒙设定之七柱神(五)
- 前端悬浮窗效果_头条|磁悬浮离心机组迎来市场春天
- c盘能达到1T吗,为什么?
- 阿里再减持陌陌股份 持股比例从20.2%降至14%
- Office之Word
- NYOJ-88-汉诺塔(一)
- 函数式编程学习之路(四)
- Hi Developer,您有一份来自华为云学院的微服务开发攻略请查收
- CSDN使用MD编辑器写博客如何让图片居中(调整图片位置大小)MD编辑器学习笔记
- 测试透射晶格分析的软件,透射电镜(TEM)
- 深度:企业为什么需要一个平台级的OA产品?
- vue常用之“定义全局变量constants”
- go语言求时间的差值(按天数算)
- Pycharm2018激活注册码(有效期至2019.05)python
- 尸体火化,世界上再也找不到第二个比我社死的人了
- IAR更改更改字体的办法,完美解决!