使用快排思想解决TopK问题和数据流的中位数
快速排序
快速排序这里就不多介绍了,Partition函数为快速排序的核心函数,负责选择一个数字将比这个数字小的数字放到左边,大的数字放到右边,最后返回这个数字的下标,下面为使用golang 实现的代码。
1 | // 快速排序 |
Top K 问题:最大的K个数字
使用快速排序的分治思想可以将这个问题的时间复杂度降低到O(n)
减治法 : 减治法比分治法效率更高,相比于分治法,减治法只需要解决分治之后其中一个子问题,而分治法需要解决分治后的所有子问题,所以它的时间复杂度为O(n)
1 | func TopK(nums []int, k int) []int { |
无序数组的中位数
如果数组的个数为奇数则中位数为排序后位于中间的那个数字, 如果个数为偶数,则中位数为排序后中间两个数字的平均值,所以要分两种情况。
此问题同样可以使用快排的partition函数解决,时间复杂度为O(n)
1 | func GetMedian(nums []int) float64 { |
def NumberOf1Between1AndN_Solution(n):
ones,m =0,1
while m<=n:
ones += (n//m+8)//10m + (n//m%10==1)(n%m+1)
m *= 10
作者:daisyyyyyyyy
来源:CSDN
原文:https://blog.csdn.net/u013129109/article/details/79765776
版权声明:本文为博主原创文章,转载请附上博文链接!