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