https://leetcode-cn.com/problems/kth-smallest-element-in-a-sorted-matrix/
思路:显然易得矩阵最小值为
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
k
k小元素的值
m
i
d
mid
mid,再遍历矩阵的每一行(或列)判断
<
=
m
i
d
<=mid
<=mid的数的总和,假设为
n
u
m
num
num,如果
n
u
m
>
=
k
num>=k
num>=k说明
m
i
d
mid
mid过大,否则说明
m
i
d
mid
mid过小。
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-1
else:
l=mid+1
return l
def kthSmallest(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=0
for each in matrix:
if num>=k:
break
num+=self.upper_bound(each,mid)
if num>=k:
r=mid-1
else:
l=mid+1
return l