转眼间大学毕业了,找工作的过程不是很顺利,虽然也面过几家知名的互联网企业(阿里,PPTV等)且坚持到了终面,但还是以失败告终,除了运气成分之外,更多的还是因为自己的算法钻研的不够深,故产生了这个想法:通过写一系列关于算法的博客来提高自己的算法水平,希望自己能坚持下去。
这道题目是我在面试PPTV时,面试官出的一道题,据说是原百度的校招题:即25匹赛马,只有五条跑道,问需要比赛几次才能确定前5匹马。
不过面试官换了一种描述:
给定一个方法sort,每次最多排序5个数,
只使用该排序方法,给定25个无序的数,
问需要调用sort方法几次可以得到前4个数。
这道题难度适中,不算很难,一般都能得到一种解法,但是得到最优解还是要思考一下的。
25个数需要得到前4个数,不管怎样这25个数肯定都要比较一遍,所以第一步的话很容易想到:将25个数分成五组,对五组分别进行排序,得到五组有序的数组。
比较容易想到的一种解法如下:
5组数组都已经有序了,每一组的最大数都是已知了,接下来只需要取每组的第一个数进行排序,就能获得一个要求的数(逐个获取最大的数),去除这个数,然后再如此反复比较(即每一次都取每组中的第一个数进行排序,就能依次获得第二个数,第三个数,和第四个数),这样总共需要9次排序。下面的图说明了一种可能出现的排序情况
同理,最后一次排序(即第九次排序)也是重复这个过程,到第九次就可以获得前四个数了。
当然,九次排序明显不是最优解,因为在这九次排序中我们做了多余的比较,注意到题目只需要取前四个数,当第六次排序后。我们就可以排除掉一些不可能的数据,很显然,第五组中的数是可以排除的,因为第五组中最大的数也只可能是第五大的数(前四组的第一个数都比它大),同理,第四组的后四个数也是不可能的,第三组的最后三个,第二组的最后两个和第一组的最后一个数,这些数都可以排除。
排除了这些数以后,我们就可以减少排序次数了,第六次排序后可以排除:1、已经确定的最大的数 2、上面列举出来的数(共15个)
这样第六次排序后还需要比较的数只剩下9个了,如下图。
剩下的9个数中还需要比较出前三个数来,只需要两次排序即可。
第七次排序