給定乙個n x n
矩陣,其中每行和每列元素均按公升序排序,找到矩陣中第k
小的元素。
這道題和之前的搜尋二維矩陣2類似。都是從矩陣的左下角開始遍歷。第k小的元素有乙個範圍,在最大值和最小值之間進行二分搜尋。
from typing import *
class solution:
def check(self, matrix, val):
'''找到矩陣中小於等於val元素的個數
:param matrix:
:param val:
:return:
'''m, n = len(matrix), len(matrix[0])
i, j = m - 1, 0
cnt = 0
while i >= 0 and j < n:
if matrix[i][j] <= val:
cnt += (i + 1)
j += 1
else:
i -= 1
return cnt
def kthsmallest(self, matrix: list[list[int]], k: int) -> int:
l, r = matrix[0][0], matrix[-1][-1]
while l <= r:
mid = (l + r) // 2
num = self.check(matrix, mid)
if num >= k: # 找到的為最小的l,最小的l正好在陣列中
# 大於等於時要向左搜尋
r = mid - 1
else:
l = mid + 1
return l
leetcode 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 class solut...
leetcode 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 解題方法 使用優先佇列...
LeetCode 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 此題用二分法。給定二維...