Lintcode401 Kth Smallest Number in Sorted Matrix solution 題解
【題目描述】
Find the kth smallest number in at row and column sorted matrix.
在一個排序矩陣中找從小到大的第 k 個整數。
排序矩陣的定義為:每一行遞增,每一列也遞增。
【題目鏈接】
www.lintcode.com/en/problem/kth-smallest-number-in-sorted-matrix/
【題目解析】
尋找第k小的數,可以聯想到轉化為數組後排序,不過這樣的時間復雜度較高:O(n^2 log n^2) + O(k).
進一步,換種思路,考慮到堆(Heap)的特性,可以建立一個Min Heap,然後poll k次,得到第k個最小數字。不過這樣的復雜度仍然較高。
考慮到問題中矩陣本身的特點:排過序,那麽可以進一步優化算法。
[1 ,5 ,7],
[3 ,7 ,8],
[4 ,8 ,9],
因為行row和列column都已排序,那麽matrix中最小的數字無疑是左上角的那一個,坐標表示也就是(0, 0)。尋找第2小的數字,也就需要在(0, 1), (1, 0)中得出;以此類推第3小的數字,也就要在(0, 1), (1, 0), (2, 0), (1, 1), (0, 2)中尋找。
在一個數字集合中尋找最大(Max)或者最小值(Min),很快可以聯想到用Heap,在Java中的實現是Priority Queue,它的pop,push操作均為O(logn),而top操作,得到堆頂僅需O(1)。
從左上(0, 0)位置開始往右/下方遍歷,使用一個Hashmap記錄visit過的坐標,把候選的數字以及其坐標放入一個大小為k的heap中(只把未曾visit過的坐標放入heap),並且每次放入前彈出掉(poll)堆頂元素,這樣最多會添加(push)2k個元素。時間復雜度是O(klog2k),也就是說在矩陣自身特征的條件上優化,可以達到常數時間的復雜度,空間復雜度也為O(k),即存儲k個候選數字的Priority Queue (Heap)。
【參考答案】
www.jiuzhang.com/solutions/kth-smallest-number-in-sorted-matrix/
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請註明出處。
Lintcode401 Kth Smallest Number in Sorted Matrix solution 題解