描述

有一个整数数组,请你根据快速排序的思路,找出数组中第 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大(基于快排)相关推荐

  1. ACdream 1099——瑶瑶的第K大——————【快排舍半,输入外挂】

    瑶瑶的第K大 Time Limit:2000MS     Memory Limit:128000KB     64bit IO Format:%lld & %llu Submit Status ...

  2. 面试官:海量无序数据,寻找第 K 大的数,越快越好

    最近在参加阿里云举办的<第三届数据库大赛创新上云性能挑战赛--高性能分析型查询引擎赛道>,传送门: https://tianchi.aliyun.com/competition/entra ...

  3. 海量无序数据寻找第 K 大的数

    前言 最近在参加阿里云举办的<第三届数据库大赛创新上云性能挑战赛--高性能分析型查询引擎赛道>,传送门:https://tianchi.aliyun.com/competition/ent ...

  4. 牛客题霸 [寻找第K大] C++题解/答案

    牛客题霸 [寻找第K大] C++题解/答案 题目描述 有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数. 给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的 ...

  5. [C++日常小题] 寻找第k大数字(numberk)

    Description 经过长时间的筹备工作,在Jourk,Ronny,Plipala,阿长,阿沈等人的努力下,DM实验室建立起自己的系列网站,其中包括三个大板块:DMOJ首页.DMOJ论坛.DMOJ ...

  6. java中二叉树中第k大的数,寻找第k大的数

    目录: 1.引子 2.排序解决法 3.类快排解法 4.最小堆解法 1.引子 日常编码中,常见遇到这样的问题,"寻找最大的数",此问题非常容易,可暴力直接遍历找出,也可使用分冶策略找 ...

  7. 寻找第K大元素的八大算法、源码及拓展

    寻找第K大元素的八大算法.源码及拓展 http://www.cnblogs.com/bethunebtj/p/4861378.html 一.问题描述 所谓"第(前)k大数问题"指的 ...

  8. 寻找第K大 --- 牛客网

    寻找第K大 题目链接 描述 代码 题目链接 https://www.nowcoder.com/questionTerminal/e016ad9b7f0b45048c58a9f27ba618bf 描述 ...

  9. 46最小的k个数 47寻找第k大

    46 最小的k个数 第一反应排序的话是O(nlogn),暴力是O(NK),看了题解用优先队列,因为优先队列插入元素需要logn,我们只要让堆的大小控制在k,插入一个元素就值需要logk,这样整体的时间 ...

  10. 快速排序 寻找第K大的数

    对于海量不确定数据,可采用维护大小为K的最小堆不断更新前K大的数 但对于数量有限的数组,可采用快速排序的思想寻找第K大的数,时间复杂度为O(lgN) 即快排之后, 若K刚好为基准点下标,那么返回基准点 ...

最新文章

  1. 基于深度学习的文本数据特征提取方法之Glove和FastText
  2. adobe仿宋std r常规_宜春MF4003-5-06-CV-R气体质量流量计
  3. 开放下载!解锁 Serverless 从入门到实战大“橙”就
  4. VSAN见证虚拟设备
  5. 虚无鸿蒙哪个厉害,【图说鸿蒙】鸿蒙设定之七柱神(五)
  6. 前端悬浮窗效果_头条|磁悬浮离心机组迎来市场春天
  7. c盘能达到1T吗,为什么?
  8. 阿里再减持陌陌股份 持股比例从20.2%降至14%
  9. Office之Word
  10. NYOJ-88-汉诺塔(一)
  11. 函数式编程学习之路(四)
  12. Hi Developer,您有一份来自华为云学院的微服务开发攻略请查收
  13. CSDN使用MD编辑器写博客如何让图片居中(调整图片位置大小)MD编辑器学习笔记
  14. 测试透射晶格分析的软件,透射电镜(TEM)
  15. 深度:企业为什么需要一个平台级的OA产品?
  16. vue常用之“定义全局变量constants”
  17. go语言求时间的差值(按天数算)
  18. Pycharm2018激活注册码(有效期至2019.05)python
  19. 尸体火化,世界上再也找不到第二个比我社死的人了
  20. IAR更改更改字体的办法,完美解决!

热门文章

  1. 回环检测回环校正(二):回环校正原理
  2. iPhone 4s手机内部构造
  3. 2062门课程名称翻译大全
  4. mt6582芯片技术简介
  5. 怎么看伦敦银实时行情走势图?
  6. HU(处理单位)管理
  7. android支付宝首页布局,类似支付宝首页——RecycleView多布局结构实现
  8. ins营销是什么意思?
  9. 国内外智慧城市建设人才与开发的经验借鉴
  10. 小陈学JS js内置对象 Date对象