题目描述:来自LeetCode

思路:快速排序的时间复杂度是O(NlogN),但是基于快速排序的选择排序算时间复杂度只有O(N)。快速排序:就是找到一个枢轴,将枢轴左边比枢轴大的数都移动到枢轴右边,枢轴右边比枢轴小的数移到枢轴左边,再对左边和右边分别用同样的方法排序,最后得到一个有序的数组。而快速选择找到第k大的数或者第k小的数,我们并不用每次都将两边排序,我们只用排序k所在的一边就行。比如说第一次排序之后,数组左边的数一定全部小于右边,即使我们再对左边和右边进行排序,在左边的数还是在左边,在右边的数还是在右边,也就是说每次排序,我们都能通过k这个下标来确定k在左边还是右边,那我们每次排序k所在的一边就行了,至于另一边是否有序,都对结果没有影响。举个例子 [1 4 3 7 2],k=2,找第k小的数,第一次排序后[1 2 3 7 4],k=2,下标2-1=1(因为从0开始存,第k小的数在数组位置是k-1)位于枢轴mid=2的左边,那我们就只用排序左侧,就可以找到第k小的数啦。

快速排序使用两个指针,初始时指针指向数组两侧不是数组第一个和最后一个哦,因为我们用的do-while,递归结束的条件就是两个指针指向同一个位置。

这道题是求第k个最大的元素,跟求第k个最小的数原理一样,只不过求第k大用递减排序,求第k小用递增排序

int findKthLargest(vector<int>& nums, int k) {int n=nums.size();return quick_select(0,n-1,nums,k-1);}int quick_select(int l,int r,vector<int>& nums,int k){if(l==r) return nums[l];int i=l-1,j=r+1;int mid=nums[(l+r)>>1];while(i<j){do i++;while(nums[i]>mid);do j--;while(nums[j]<mid);if(i<j) swap(nums[i],nums[j]);}if(k<=j) return quick_select(l,j,nums,k);return quick_select(j+1,r,nums,k);}

今日刷题任务完成,如有错误,欢迎指正~

LeetCode.数组中的第k个最大的元素(基于快速排序的选择排序算法)相关推荐

  1. LeetCode实战:数组中的第K个最大元素

    背景 为什么你要加入一个技术团队? 如何加入 LSGO 软件技术团队? 我是如何组织"算法刻意练习活动"的? 为什么要求团队的学生们写技术Blog 题目英文 Find the kt ...

  2. vector删除第i个元素_[LeetCode] 215. 数组中的第K个最大元素

    题目链接:https://leetcode-cn.com/problems/kth-largest-element-in-an-array/) 题目描述: 在未排序的数组中找到第 k 个最大的元素.请 ...

  3. LeetCode 215. 数组中的第K个最大元素(快速排序)

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

  4. LeetCode——215,数组中的第K个最大元素(分治法)

    尹成老师带你学算法 /*** \* Created: liuhuichao* \* Date: 2020/1/27* \* Time: 11:32 上午* \* Description: 数组中的第K ...

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

    题目描述 在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大 的元素,而不是第 k 个不同的元素. 题解 快速排序 代码 class Solution { pub ...

  6. 数组中的第K个最大元素(TopK问题)

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

  7. leetcode-215 数组中的第K个最大元素

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

  8. 算法-----数组------ 数组中的第K个最大元素

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

  9. DC-leetcode215数组中的第k大元素

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

最新文章

  1. 开放地址法实现HashTable
  2. 最小割分治(最小割树):BZOJ2229 BZOJ4519
  3. [转]数据库开发21条军规
  4. ioremap 与 mmap【转】
  5. 托福备考有用的心得 ——转载
  6. java代码里的JSON格式怎么写好看_谁会不爱让代码骚里骚气的VSCode扩展插件呢?...
  7. 【学员管理系统】0x01 班级信息管理功能
  8. 神经网络的Dropout正则化
  9. 操作系统复习笔记--第十一、十二章 文件系统的实现与大容量存储结构
  10. 英特尔神经计算棒是什么?边缘计算又是什么?
  11. 百度云平台BAE空间申请
  12. .net反编译的九款神器
  13. MSP430F149用模拟SPI和FM25CL640通信
  14. 未成年人勿进 谨以献给1980~1990出生的人(五)
  15. 微信SDK中含有的支付功能怎么去掉?
  16. 更换ruby源----RubyGems 镜像 - 淘宝网
  17. Telnet访问百度www.baidu.com
  18. 【Caffe学习三】基于ROC-RK3399-PC/Ubuntu18.04的Caffe-SSD-CPU 安装编译___BUG
  19. keil5 串口仿真 ASSIGN COM4 S1IN S1OUT
  20. emoji mysql 乱码 php_MYSQL utf8mb4 插入emoji表情乱码

热门文章

  1. CUDA安装位置版本查询
  2. python时间间隔循环_python循环间隔
  3. virtio,macvtap,sriov
  4. 有两种歌声可以打动我
  5. 项目管理工具提升开发效率(IDEA+Git)
  6. 买三种文具编程C语言,学生党公认“最没用”的三种文具,学生:中看不中用,谁买谁吃亏...
  7. python高级编程函数_Python高级编程之十大装B语法
  8. 欢迎入坑单目深度估计
  9. HBuilderX uni-app 打包发行微信小程序
  10. Qt第十八章:Qt Designer窗口切换