1、题目描述:
2、题解:
方法1:排序
先设置一个数组nums,然后遍历matrix,添加到nums中,然后对nums排序,返回nums的第k-1个数。
class Solution:
def kthSmallest(self, matrix: List[List[int]], k: int) -> int:
nums = []
if not matrix :
return 0
m = len(matrix)
n = len(matrix[0])
for i in range(m):
for j in range(n):
nums.append(matrix[i][j])
nums.sort()
return nums[k-1]
方法2:二分查找
在主函数中运用二分查找的模板,(见算法思想 从0到1:分治法——二分查找模板小结(三种:第一种基础,推荐掌握第二种,第三种是第二种的变体)
在循环中,先调用函数来查找matrix二维数组在mid前有几个值,也就是小于mid的有几个值,记为count,
然后让count和k比较。
调用的函数大致思路如下:
在matrix中从下到上、从左到右,查找小于等于mid的值有多少个
代码如下:
class Solution:
def kthSmallest(self, matrix: List[List[int]], k: int) -> int:
#二分查找
row,col = len(matrix),len(matrix[0])
left,right = matrix[0][0],matrix[row - 1][col - 1]
while left < right:
mid = left + (right - left) // 2
count = self.findNotBiggerThanMid(matrix,mid,row,col)
if count < k:
left = mid + 1
else:
right = mid
return right
def findNotBiggerThanMid(self,matrix,mid,row,col):
i = row - 1
j = 0
count = 0
while i >= 0 and j < col:
if matrix[i][j] <= mid:
count += i + 1
j += 1
else:
i -= 1
return count
或者:
class Solution:
def kthSmallest(self, matrix: List[List[int]], k: int) -> int:
# 二分查找
n = len(matrix)
left,right = matrix[0][0],matrix[n-1][n-1]
while left < right:
mid = left + (right-left) // 2
count = self.findNotBiggerThanMid(matrix,mid,n)#寻找在mid前有几个值
if count < k:
left = mid + 1
else:
right = mid
return right
def findNotBiggerThanMid(self,matrix,mid,n):
row,col = n-1,0#row为行,col为列
count = 0
while row >= 0 and col < n:
if matrix[row][col] <= mid:
count += row + 1
col += 1
else:
row -= 1
return count
3、复杂度分析:
方法1:
时间复杂度:O(N^2logN),对 N^2个数排序
空间复杂度:O(N^2)
方法2:
时间复杂度:O(Nlog(maxval - minval))
空间复杂度:O(1)