350,有序矩陣中第K小的元素

2021-10-09 19:12:20 字數 1426 閱讀 2342

給定乙個 n x n 矩陣,其中每行和每列元素均按公升序排序,找到矩陣中第k小的元素。

請注意,它是排序後的第k小元素,而不是第k個元素。

示例:

matrix = [

[ 1, 5, 9],

[10, 11, 13],

[12, 13, 15]

],k = 8,

返回13。

答案:

public

intkthsmallest

(int

matrix,

int k));

for(

int i =

0; i < k -

1; i++))

;}return pq.

poll()

[2];

}

解析:priorityqueue會對新增進去的資料進行排序,其實他就是乙個堆,在這裡他是個最小堆,也就是最頂端的元素是最小的(雖然他是陣列結構,但陣列的位置是有關聯的),每新增乙個元素他都會往上調整,刪除的時候往下調整,並且他有兩個最重要的函式乙個是siftdown,乙個是siftup。上面的**中它新增的是個陣列,陣列的最後乙個元素是我們新增的值,前兩個元素是這個值在矩陣中(x,y)的座標。他是先把矩陣中第一行的元素全部新增進去,後面再進行k-1次迴圈。每次迴圈的時候都會把最小的給移除掉,然後把它緊挨著的下乙個元素新增進去。因為是最小堆,所以當我們移除了k-1次的時候,這時堆的頂端就是第k小的元素。我們還以上面的例子來畫個圖加深一下理解

題中矩陣的每行每列都是排過序的,所以我們還可以想到另一種方法,使用二分法查詢,之前介紹過二分法查詢,不會的可以看下202,查詢-二分法查詢

public

intkthsmallest

(int

matrix,

int k)

if(count < k)

low = mid +1;

else

high = mid;

}return low;

}

因為矩陣的行和列都是排過序的,這裡先找到最中間的值,count表示的是比mid小的值有多少個,每次都是用每行的最右邊的乙個值和mid比較,直到比mid大,才會執行上面的while迴圈,然後再往前找,這裡的第count個值是大於mid的最小值,所以我們不能在count==k的時候直接return。

有序矩陣中第k小元素

題目 給定乙個 n x n 矩陣,其中每行和每列元素均按公升序排序,找到矩陣中第 k 小的元素。請注意,它是排序後的第 k 小元素,而不是第 k 個不同的元素。看到有序就會想到二分查詢,而本題的二分查詢十分的有趣。根據這個矩陣的定義,我們知道,最小的元素是最左上角元素,最大的元素是最左下角元素。由此...

有序矩陣中第K小的元素

給定乙個 n x n 矩陣,其中每行和每列元素均按公升序排序,找到矩陣中第k小的元素。請注意,它是排序後的第k小元素,而不是第k個元素。示例 matrix 1,5,9 10,11,13 12,13,15 k 8,返回 13。說明 你可以假設 k 的值永遠是有效的,1 k n2 分析 因為是整數,可使...

LeetCode 有序矩陣中第K小的元素

給定乙個 n x n 矩陣,其中每行和每列元素均按公升序排序,找到矩陣中第k小的元素。請注意,它是排序後的第k小元素,而不是第k個元素。示例 matrix 1,5,9 10,11,13 12,13,15 k 8,返回 13。public boolean guess int matrix,int mi...