top K的解题思路
很早记得,出去面试,经常有人问:最大值怎么求,对一个经过变成训练的人,或许都会解这个题目,因为最大值是我们程序员的一个最最基本的素养。其实还可以拓展就最K大的值,也就是我们常说的top K
问题,最大其实就是top 1大,还有第二大,第三大的问题吧。
其实对于K的问题,最简单的方式,就是先排序,排完序,孰大孰小,一目了然,这个是最基础的思路,不过本文会从其他更高效的路径出发,来解题。
最值求法
关于最大值求法,直接附伪代码:
1 | int max(arr) |
这个就是将最大值默认设置未第一个值,后面就和这个最大值比较,比这个最大值大的就直接替换掉,再和后面的值比较,直到最后,得到的最大值肯定是整个数组中最大的一个。
冒泡
冒泡排序其实就是这个思路,最大值(或者最小值)肯定在最后,次大在最大值(或者最小值)前面。
如对76,18,99,35, 12
进行排序:
冒泡一次,可将最小值求出,以此类推,第一次,需要76,18,99,35
排序,次小值18
就被冒泡出。
所以冒泡是可以解决top K
的问题的,如求第二大的值,只需要进行K次冒泡即可:
1 | // k表示第k大 k>=1 |
我们假设是一个数据2,8,7,1,3.5,6,4
可以知道,第一轮排序
1 | 2 1 3 4 7 5 6 8 |
作为参考物的4 放到第4位,所以4
肯定是第5大(7 5 6 8都比5大)的,因为前面的比它小(或相等),后面比它大(或相等),这么一说你是不是有点思路啦。
你求K大,若是按照从小到大的顺序排序的话,肯定是在
A.size - K
位置上,需要转化下
其实快速排序将整个长数组,切成两部分,假设它所在的位置M,那他肯定是是第A.size-M
大,如果这个A.size-M
的值比K大,说明你要找的第k大是在比它大的那部分里面,再进行一次Partition,肯定还会有个中间数,在比较,知道你找到即可。
如刚才的2 1 3 4 7 5 6 8
若是你求第6大,那么 A.size-M
= 8-3 (4
说在位置)< 6 ,所以去左边找,若是 A.size-M
> k,去右边。
1 | //若是求k大,从小到大排序应该是A.size-k |
- 本文链接:http://ownwell.github.io/2018/03/11/top-K的解题思路/
- 版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 CN 许可协议。转载请注明出处!