【Leetcode】大神总结的所有TopK问题模板(基于快速排序)
基本思想
通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。
实现原理
整个数组找基准正确位置,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面。
Partition函数
首先,先写partition模板
def partition(nums, left, right):pivot = nums[left]#初始化一个待比较数据i,j = left, rightwhile(i < j):while(i<j and nums[j]>=pivot): #从后往前查找,直到找到一个比pivot更小的数j-=1nums[i] = nums[j] #将更小的数放入左边while(i<j and nums[i]<=pivot): #从前往后找,直到找到一个比pivot更大的数i+=1nums[j] = nums[i] #将更大的数放入右边#循环结束,i与j相等nums[i] = pivot #待比较数据放入最终位置 return i #返回待比较数据最终位置
快速排序
#快速排序
def quicksort(nums, left, right):if left < right:index = partition(nums, left, right)quicksort(nums, left, index-1)quicksort(nums, index+1, right)arr = [1,3,2,2,0]
quicksort(arr, 0, len(arr)-1)
print(arr)
topk切分
将快速排序改成快速选择,即我们希望寻找到一个位置,这个位置左边是k个比这个位置上的数更小的数,右边是n-k个比该位置上的数大的数,我将它命名为topk_split,找到这个位置后停止迭代,完成了一次划分。
def topk_split(nums, k, left, right):#寻找到第k个数停止递归,使得nums数组中index左边是前k个小的数,index右边是后面n-k个大的数if (left<right):index = partition(nums, left, right)if index==k:return elif index < k:topk_split(nums, k, index+1, right)else:topk_split(nums, k, left, index-1)
获得前k小的数
#获得前k小的数
def topk_smalls(nums, k):topk_split(nums, k, 0, len(nums)-1)return nums[:k]arr = [1,3,2,3,0,-19]
k = 2
print(topk_smalls(arr, k))
print(arr)
获取第k小的数
#获得第k小的数
def topk_small(nums, k):topk_split(nums, k, 0, len(nums)-1)return nums[k-1] #右边是开区间,需要-1arr = [1,3,2,3,0,-19]
k = 3
print(topk_small(arr, k))
print(arr)
获得前k大的数
#获得前k大的数
def topk_larges(nums, k):#parttion是按从小到大划分的,如果让index左边为前n-k个小的数,则index右边为前k个大的数topk_split(nums, len(nums)-k, 0, len(nums)-1) #把k换成len(nums)-kreturn nums[len(nums)-k:] arr = [1,3,-2,3,0,-19]
k = 3
print(topk_larges(arr, k))
print(arr)
获得第k大的数
#获得第k大的数
def topk_large(nums, k):#parttion是按从小到大划分的,如果让index左边为前n-k个小的数,则index右边为前k个大的数topk_split(nums, len(nums)-k, 0, len(nums)-1) #把k换成len(nums)-kreturn nums[len(nums)-k] arr = [1,3,-2,3,0,-19]
k = 2
print(topk_large(arr, k))
print(arr)
只排序前k个小的数
#只排序前k个小的数
#获得前k小的数O(n),进行快排O(klogk)
def topk_sort_left(nums, k):topk_split(nums, k, 0, len(nums)-1) topk = nums[:k]quicksort(topk, 0, len(topk)-1)return topk+nums[k:] #只排序前k个数字arr = [0,0,1,3,4,5,0,7,6,7]
k = 4
topk_sort_left(arr, k)
只排序后k个大的数
#只排序后k个大的数
#获得前n-k小的数O(n),进行快排O(klogk)
def topk_sort_right(nums, k):topk_split(nums, len(nums)-k, 0, len(nums)-1) topk = nums[len(nums)-k:]quicksort(topk, 0, len(topk)-1)return nums[:len(nums)-k]+topk #只排序后k个数字arr = [0,0,1,3,4,5,0,-7,6,7]
k = 4
print(topk_sort_right(arr, k))
作者:jun-lin-w
链接:https://leetcode-cn.com/problems/kth-largest-element-in-an-array/solution/ji-yu-kuai-pai-de-suo-you-topkwen-ti-jia-ylsd/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
猜你喜欢:
【Leetcode】大神总结的所有TopK问题模板(基于快速排序)相关推荐
- 空间素材代码_C++大神解读视频捕获程序,VC++基于Directx开发的源代码
一款小巧的视频捕获程序,VC++6.0基于Directx开发的源代码,编译时需要Directx相关类库文件, 窗口表单编写的简单视频捕捉应用程序.这个工程既演示了窗口表单应用程序的创建,又演示了 Op ...
- [LeetCode]LRU Cache有个问题,求大神解答【已解决】
题目: Design and implement a data structure for Least Recently Used (LRU) cache. It should support the ...
- LeetCode github集合,附CMU大神整理笔记
Github LeetCode集合 本人所有做过的题目都写在一个java项目中,同步到github中了,算是见证自己的进步.github目前同步的题目是2020-09-17日之后写的题.之前写过的题会 ...
- 如何在大学里成为IT技术大神?
阅读本文大概需要 20 分钟. 写在前面 前文回顾:机器学习实战--住房月租金预测(2) 这篇文章并非原创,在大一的时候完全是被标题所吸引,好在文章没有让自己失望,现在回顾自己学习编程的日子里,正是这 ...
- 一个不会翻转二叉树的大神
2015 年 6 月 10 日,Max Howell 发表了一篇推特: 简单翻译:Google 说,我们 90% 的工程师都使用你写的软件--Homebrew,但是因为你不能在白板上翻转一棵二叉树,所 ...
- 菜鸟、普通、大牛、大神
更多内容关注微信公众号:fullstack888 程序员这个物种自诞生以来,便产生了森严的等级制度,划分标准十分复杂却又有规律可循. 我们暂且分为:菜鸟.普通.大牛.大神四个等级,并用图鉴形式来表现各 ...
- Android大神微博集
Trinea 的博客 来自滴滴出行,Android 开发助手 开发者,android-open-project 维护者 ,android-open-project-analysis 维护者. 中二病也 ...
- 斩获BAT-offer大神的两万字面试干货分享
0.写在最前 首先呢我的面试经历和一些面霸和收割机的大神相比绝不算丰富,但我这三个月应该能代表很大一部分人的心路历程:从无忧无虑也无知的状态,然后遭遇挫败,跌入低谷,连续数天的黑暗,慢慢调整,逼着自己 ...
- 如何给页面加上loding_如何给片头添加字幕?视频剪辑大神们都这样玩
大家在刷视频时,有没有留意到很多正片前还有一段片头,这是为了使视频内容呈现得更完整.有时候,小伙伴们还会给视频加上一段片尾.与正片相比,片头比较单调,但它的作用很重要.为了使人们更加清楚视频内容的表达 ...
最新文章
- 使用Redis搭建电商秒杀系统
- P3项目全球模板狗血设置之一 --- 发货到成本中心需要输入Customer
- [Ubuntu] 如何在Ubuntu11.04将PHP5.3降级到PHP5.2
- 多径传播matlab仿真·信号分析处理
- 【渝粤教育】国家开放大学2018年春季 0674-21T财务管理 参考试题
- 考研编程练习----排名
- 学会使用ant design封装一个锚点组件
- node.js入门 - 7.异常处理与多进程开发
- 10分钟搭建一个H5商城,支持微信支付和各平台小程序
- CS229的简单梳理(待续)
- ThinkPHP5 引入 Go AOP
- Ubuntu 18.04实现实时显示网速
- 这两位学习软件测试的小伙伴,简直太给力了
- 算法岗面经总结(快看漫画)
- Excel使用公式引用其它sheet数据创建序列,无法忽略空白值的解决办法
- 盛世昊通拼车车通证,以共享经济实现行业颠覆
- 步进电机每转步数和步进角关系:每转步数 = 360°/歩进角
- MySQL--DQL
- 通过QQ手机和电脑无线传输文件
- Spring Boot集成Hprose
热门文章