思路:顯然易得矩陣最小值為m[0
][0]
m[0][0]
m[0][0
],最大值為m[n
−1][
n−1]
m[n-1][n-1]
m[n−1]
[n−1
],那麼我們可以二分第k
kk小元素的值mid
midmi
d,再遍歷矩陣的每一行(或列)判斷<=m
id<=mid
<=m
id的數的總和,假設為num
numnu
m,如果num
>=k
num>=k
num>=k
說明m id
midmi
d過大,否則說明mid
midmi
d過小。
class
solution
:def
upper_bound
(self,array,k)
: l,r=0,
len(array)-1
while l<=r:
mid=
(l+r)//2
if array[mid]
>k:
r=mid-
1else
: l=mid+
1return l
defkthsmallest
(self, matrix: list[list[
int]
], k:
int)
->
int:
n=len(matrix)-1
l,r=matrix[0]
[0],matrix[n]
[n]while l<=r:
mid=
(l+r)//2
num=
0for each in matrix:
if num>=k:
break
num+=self.upper_bound(each,mid)
if num>=k:
r=mid-
1else
: l=mid+
1return l
力扣第378題 有序矩陣中第K小的元素
給定乙個 n x n 矩陣,其中每行和每列元素均按公升序排序,找到矩陣中第 k 小的元素。請注意,它是排序後的第 k 小元素,而不是第 k 個不同的元素。示例 matrix 1,5,9 10,11,13 12,13,15 k 8,返回 13。解法1 使用flat 加上sort 之後根據index進行...
C語言 力扣 378 有序矩陣中第K小的元素
給定乙個 n x n 矩陣,其中每行和每列元素均按公升序排序,找到矩陣中第 k 小的元素。請注意,它是排序後的第 k 小元素,而不是第 k 個不同的元素。matrix 1,5,9 10,11,13 12,13,15 k 8,返回 13。該題目在力扣中屬於中等難度,因此確實是有些難到我了?不過沒事,最...
LC 378 有序矩陣中第K小的元
傳送門 思路 1.對所有元素排序,時間複雜度 o n 2log n2 o n 2logn 2 o n2lo gn2 class solution 2.根據矩陣圖形的性質可知,小於等於某乙個數的圖形在矩陣左上方,大於該數的部分在右下方,且左上角數最小,右下角數最大,因此考慮二分答案,從a n 1 0 ...