LeetCode.数组中的第k个最大的元素(基于快速排序的选择排序算法)
题目描述:来自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个最大的元素(基于快速排序的选择排序算法)相关推荐
- LeetCode实战:数组中的第K个最大元素
背景 为什么你要加入一个技术团队? 如何加入 LSGO 软件技术团队? 我是如何组织"算法刻意练习活动"的? 为什么要求团队的学生们写技术Blog 题目英文 Find the kt ...
- vector删除第i个元素_[LeetCode] 215. 数组中的第K个最大元素
题目链接:https://leetcode-cn.com/problems/kth-largest-element-in-an-array/) 题目描述: 在未排序的数组中找到第 k 个最大的元素.请 ...
- LeetCode 215. 数组中的第K个最大元素(快速排序)
1. 题目 在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 k = 2 ...
- LeetCode——215,数组中的第K个最大元素(分治法)
尹成老师带你学算法 /*** \* Created: liuhuichao* \* Date: 2020/1/27* \* Time: 11:32 上午* \* Description: 数组中的第K ...
- LeetCode 215 数组中的第K个最大元素
题目描述 在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大 的元素,而不是第 k 个不同的元素. 题解 快速排序 代码 class Solution { pub ...
- 数组中的第K个最大元素(TopK问题)
题目描述 在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 k = 2 ...
- leetcode-215 数组中的第K个最大元素
在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 k = 2 输出: 5 ...
- 算法-----数组------ 数组中的第K个最大元素
在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素.示例 1:输入: [3,2,1,5,6,4] 和 k = 2 输出: 5 示 ...
- DC-leetcode215数组中的第k大元素
在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 k = 2 输出: 5 ...
最新文章
- 开放地址法实现HashTable
- 最小割分治(最小割树):BZOJ2229 BZOJ4519
- [转]数据库开发21条军规
- ioremap 与 mmap【转】
- 托福备考有用的心得 ——转载
- java代码里的JSON格式怎么写好看_谁会不爱让代码骚里骚气的VSCode扩展插件呢?...
- 【学员管理系统】0x01 班级信息管理功能
- 神经网络的Dropout正则化
- 操作系统复习笔记--第十一、十二章 文件系统的实现与大容量存储结构
- 英特尔神经计算棒是什么?边缘计算又是什么?
- 百度云平台BAE空间申请
- .net反编译的九款神器
- MSP430F149用模拟SPI和FM25CL640通信
- 未成年人勿进 谨以献给1980~1990出生的人(五)
- 微信SDK中含有的支付功能怎么去掉?
- 更换ruby源----RubyGems 镜像 - 淘宝网
- Telnet访问百度www.baidu.com
- 【Caffe学习三】基于ROC-RK3399-PC/Ubuntu18.04的Caffe-SSD-CPU 安装编译___BUG
- keil5 串口仿真 ASSIGN COM4 S1IN S1OUT
- emoji mysql 乱码 php_MYSQL utf8mb4 插入emoji表情乱码
热门文章
- CUDA安装位置版本查询
- python时间间隔循环_python循环间隔
- virtio,macvtap,sriov
- 有两种歌声可以打动我
- 项目管理工具提升开发效率(IDEA+Git)
- 买三种文具编程C语言,学生党公认“最没用”的三种文具,学生:中看不中用,谁买谁吃亏...
- python高级编程函数_Python高级编程之十大装B语法
- 欢迎入坑单目深度估计
- HBuilderX uni-app 打包发行微信小程序
- Qt第十八章:Qt Designer窗口切换