面试的时候,面试官问了这道题“求一个数组中最小的k个数”,我当时只给出了两种解法:
1. 首先使用排序,然后选择前k个值返回。这种算法最好的时间复杂度是O(nlogn),取决于所选择的排序算法
2.初始化一个k个元素的数组a,首先将数组中前k个元素放入a中,然后从K+1到最后一个元素进行如下判断:如果当前元素大于a中最大元素,继续向后遍历;如果当前元素小于a中最大元素,则替换a中最大元素.......就可以得到最小的k个数,这种算法时间复杂度可以为O(nk)。如果采用堆作为存储K个元素的容器,建堆的时间为O(k),获取堆的最大值O(1),替换最大元素后,调整堆的时间复杂度为O(logk),所以最终时间复杂度为O(nlogk),适合海量数据获取k个最大数的情况。
上面说的两种算法,面试官都不满意,等面试结束后,在网上查了一下,这就是剑指offer上面的题目。下面说一下剑指offer上面的解法。
题目并没有要求返回有序的前k个数,如数组:4,5,1,6,2,7,3,8。返回最小的4个数,结果应该为1,2,3,4(这个可以是无序的)。