Problem 1 K smallest In Unsorted Array
Method 1: Sorting
(体会下考点不再这里)==》 面试里提一个即可,不要浪费时间
High Level:
把数组从小到大排列
前k个元素就是最小的k个元素
TC& SC
O(nlogn), O(sort)
public class Solution {
public int[] kSmallest(int[] array, int k) {
Arrays.sort(array);
int[] result = new int[k];
for (int i = 0; i< k; i++) {
result[i] = array[i];
}
return result;
}
}Method 1b: 用heap sort,不用API
我要用Heap Sort,不用API
step 1: 开个heap
step 2: 把所有的元素都放在heap里,再拿出来一遍
这个方法不是heap sort,heap sort的最大的优势
不仅是可以和mergeSort一样能达到nlogn的时间
而且人家是space O(1)
TC : O(n) + O(klogn) + O(k) ==> O(nlogn)
SC: O(1)
Method 2 MinHeap(两种)
方法论:当题目求的topK和Kth和你的heap比较的优先级一致的时候,全放进去,poll K次
TC: O(nlogn)
SC: O(n)
自己实现heapify且直接poll up前k个
和前面不一样,前面那个是sort好,再解决,这个是每次都poll直到第k次,所以时间会变成O(klog n)
TC: O(n + k logn)
SC: O(1)
Method 3: MaxHeap(两种)
方法论:当题目求的topK和Kth和你的Heap比较的优先级不一样
你的heap里装的是:到目前为止topK candidate
手头先攥k个,这些是候选人
然后再撸那些没看过的元素,如果你看到更优先,我们得淘汰手头最不优先的
这个方法能用heapify优化么?
这个方法是把前k个元素放到heap里,是k size heap
heapify应该是O(k),不应该是O(n)---> 我们只应该heapify前k个元素)
---> 本质上实现一个带range的heapify
TC: O(k + (n - k) log k)
SC: O(1)
拓展:percolate and heapify只针对left = 0的代码
如果你想要拓展,必须保证left对应第一个元素,采用offset或者[left, right]
This one also works for online algorithm
体现出实时性,如果不需要读完完整的input就可以实时的知道,到目前为止的结果,这就是online算法。不然我们就称之为offline算法
Last updated