class Solution {
public:
int kthSmallest(vector<vector<int>>& matrix, int k) {
}
};
378. 有序矩阵中第 K 小的元素
给你一个 n x n
矩阵 matrix
,其中每行和每列元素均按升序排序,找到矩阵中第 k
小的元素。
请注意,它是 排序后 的第 k
小元素,而不是第 k
个 不同 的元素。
你必须找到一个内存复杂度优于 O(n2)
的解决方案。
示例 1:
输入:matrix = [[1,5,9],[10,11,13],[12,13,15]], k = 8 输出:13 解释:矩阵中的元素为 [1,5,9,10,11,12,13,13,15],第 8 小元素是 13
示例 2:
输入:matrix = [[-5]], k = 1 输出:-5
提示:
n == matrix.length
n == matrix[i].length
1 <= n <= 300
-109 <= matrix[i][j] <= 109
matrix
中的所有行和列都按 非递减顺序 排列1 <= k <= n2
进阶:
O(1)
内存复杂度)来解决这个问题?O(n)
的时间复杂度下解决这个问题吗?这个方法对于面试来说可能太超前了,但是你会发现阅读这篇文章( this paper )很有趣。原站题解
golang 解法, 执行用时: 16 ms, 内存消耗: 6.5 MB, 提交时间: 2022-11-28 13:35:35
func kthSmallest(matrix [][]int, k int) int { n := len(matrix) left, right := matrix[0][0], matrix[n-1][n-1] for left < right { mid := left + (right - left) / 2 if check(matrix, mid, k, n) { right = mid } else { left = mid + 1 } } return left } func check(matrix [][]int, mid, k, n int) bool { i, j := n - 1, 0 num := 0 for i >= 0 && j < n { if matrix[i][j] <= mid { num += i + 1 j++ } else { i-- } } return num >= k }
python3 解法, 执行用时: 40 ms, 内存消耗: 17.6 MB, 提交时间: 2022-11-28 13:35:22
class Solution: def kthSmallest(self, matrix: List[List[int]], k: int) -> int: n = len(matrix) def check(mid): i, j = n - 1, 0 num = 0 while i >= 0 and j < n: if matrix[i][j] <= mid: num += i + 1 j += 1 else: i -= 1 return num >= k left, right = matrix[0][0], matrix[-1][-1] while left < right: mid = (left + right) // 2 if check(mid): right = mid else: left = mid + 1 return left
python3 解法, 执行用时: 80 ms, 内存消耗: 17.5 MB, 提交时间: 2022-11-28 13:34:58
class Solution: def kthSmallest(self, matrix: List[List[int]], k: int) -> int: n = len(matrix) pq = [(matrix[i][0], i, 0) for i in range(n)] heapq.heapify(pq) ret = 0 for i in range(k - 1): num, x, y = heapq.heappop(pq) if y != n - 1: heapq.heappush(pq, (matrix[x][y + 1], x, y + 1)) return heapq.heappop(pq)[0]
golang 解法, 执行用时: 28 ms, 内存消耗: 7 MB, 提交时间: 2022-11-28 13:34:43
func kthSmallest(matrix [][]int, k int) int { h := &IHeap{} for i := 0; i < len(matrix); i++ { heap.Push(h, [3]int{matrix[i][0], i, 0}) } for i := 0; i < k - 1; i++ { now := heap.Pop(h).([3]int) if now[2] != len(matrix) - 1 { heap.Push(h, [3]int{matrix[now[1]][now[2]+1], now[1], now[2]+1}) } } return heap.Pop(h).([3]int)[0] } type IHeap [][3]int func (h IHeap) Len() int { return len(h) } func (h IHeap) Less(i, j int) bool { return h[i][0] < h[j][0] } func (h IHeap) Swap(i, j int) { h[i], h[j] = h[j], h[i] } func (h *IHeap) Push(x interface{}) { *h = append(*h, x.([3]int)) } func (h *IHeap) Pop() interface{} { old := *h n := len(old) x := old[n-1] *h = old[0 : n-1] return x }
golang 解法, 执行用时: 36 ms, 内存消耗: 6.5 MB, 提交时间: 2022-11-28 13:34:15
func kthSmallest(matrix [][]int, k int) int { rows, columns := len(matrix), len(matrix[0]) sorted := make([]int, rows * columns) index := 0 for _, row := range matrix { for _, num := range row { sorted[index] = num index++ } } sort.Ints(sorted) return sorted[k-1] }
python3 解法, 执行用时: 76 ms, 内存消耗: 18 MB, 提交时间: 2022-11-28 13:33:26
class Solution: def kthSmallest(self, matrix: List[List[int]], k: int) -> int: rec = sorted(sum(matrix, [])) return rec[k - 1]