1. 程式人生 > >Lintcode401 Kth Smallest Number in Sorted Matrix solution 題解

Lintcode401 Kth Smallest Number in Sorted Matrix solution 題解

ted 時間復雜度 數組 priority 描述 大小 思路 集合 操作

【題目描述】

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 題解