前K大的数
Jan 29, 2021 16:04 · 18 words · 1 minute read
TOP K
从数组中找到最大的K的数
思路一:
将整个数组排序,使用快排,O(n*logn)
思路二:
K后面的元素排序无意义,可以去掉这个步骤。使用冒泡排序,每次选择最大的一个数浮上去,重复K次后,可以得到结果,O(n*k)
思路三:
K个元素的排序也无意义,使用堆排序。取出前k个元素,建立一个小顶堆,O(k),然后遍历剩下的n-k个元素,每个元素进堆为O(logk),整个复杂度为O(k) + O((n-k)logk) = O(nlogk)
思路四:
分治法核心思路是把大问题分解为小问题,然后分开解决,最终解决大问题。
减治法是把大问题分解为小问题,然后只解决其中一个分支,也可以解决大问题。比如二分查找,每次只需要查找某一边,复杂度为O(logn).
这个问题也可以用减治法,称为随机选择。
利用快排的dopivot函数,将数组分为以i为中心的左大右小部分(分解问题),判断i与k的大小,可以知道k在i的哪一边。多次循环可以分出以k为中心的左大右小区域。循环次数与k大小无关,dopivot函数复杂度为O(n),所以整个随机选择的复杂度为O(n)