378有序矩陣中第k小的元素解法之優先佇列

2021-10-08 12:33:07 字數 869 閱讀 5946

給定乙個 n x n 矩陣,其中每行和每列元素均按公升序排序,找到矩陣中第k小的元素。請注意,它是排序後的第k小元素,而不是第k個不同的元素。

示例

matrix = [

[ 1, 5, 9],

[10, 11, 13],

[12, 13, 15]

],k = 8,

返回 13。

歸併排序的思路

使用了堆的性質。使用小根堆,已知堆的幾種演算法的時間複雜度如下:push/o(log(n)), pop/o(log(n)), top/o(log(n))

這裡的堆由於使用了樹形結構,優化了其pop以及top的時間複雜度(n到logn)。

**解題思路。**先將matrix的第0列傳入堆中,然後從中pop出最小的那個,記錄下pop的是哪個,然後傳入其在矩陣中右邊相鄰的數。這樣進行k次,第k次top出的就是最小的那個。

關於堆的用法如下:

priority_queue, greater> que;

// priority_queue優先佇列即堆

// 小根堆如上是三個引數,後兩個引數不寫預設是大根堆

// 小根堆是小的在堆頂,大根堆是大的在堆頂

// 要注意,上面的「point」是乙個結構體,所以要在結構體裡過載大於號

// 如果是大根堆,需要在結構體裡過載小於號。過載大於號形式如下:

bool operator> (const point& a) const

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

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

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

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

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

題目 給定乙個 n x n 矩陣,其中每行和每列元素均按公升序排序,找到矩陣中第 k 小的元素 思路及演算法 由題目給出的性質可知,這個矩陣的每一行均為乙個有序陣列。問題即轉化為從這 n 個有序陣列中找第 k 大的數,可以想到利用歸併排序的做法,歸併到第 k 個數即可停止。一般歸併排序是兩個陣列歸併...