給定乙個 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...