给你一个 m * n 的矩阵 mat,以及一个整数 k ,矩阵中的每一行都以非递减的顺序排列。 你可以从每一行中选出 1 个元素形成一个数组。返回所有可能数组中的第 k 个 最小 数组和。 示例 1: 输入:mat = [[1,3,11],[2,4,6]], k = 5 输出:7 解释:从每一行中选出一个元素,前 k 个和最小的数组分别是: [1,2], [1,4], [3,2], [3,4], [1,6]。其中第 5 个的和是 7 。 示例 2: 输入:mat = [[1,3,11],[2,4,6]], k = 9 输出:17 示例 3: 输入:mat = [[1,10,10],[1,4,5],[2,3,6]], k = 7 输出:9 解释:从每一行中选出一个元素,前 k 个和最小的数组分别是: [1,1,2], [1,1,3], [1,4,2], [1,4,3], [1,1,6], [1,5,2], [1,5,3]。其中第 7 个的和是 9 。 示例 4: 输入:mat = [[1,1,10],[2,2,9]], k = 7 输出:12 提示: m == mat.length n == mat.length[i] 1 <= m, n <= 40 1 <= k <= min(200, n ^ m) 1 <= mat[i][j] <= 5000 mat[i] 是一个非递减数组
时间: 2023-07-02 14:15:43 浏览: 123
这是一道比较典型的堆的题目,可以使用堆来保存每行数据的组合以及它们的和,并在堆中取出前k项。以下是一个Python的实现:
```python
import heapq
def kthSmallest(mat, k):
m, n = len(mat), len(mat[0])
heap = [(sum(mat[i]), [mat[i][0]], 0) for i in range(m)]
heapq.heapify(heap)
for _ in range(k-1):
curr_sum, curr_comb, curr_idx = heapq.heappop(heap)
if curr_idx == n - 1:
continue
for i in range(m):
new_comb = curr_comb + [mat[i][curr_idx+1]]
new_sum = curr_sum - curr_comb[-1] + new_comb[-1]
heapq.heappush(heap, (new_sum, new_comb, curr_idx+1))
return heapq.heappop(heap)[0]
```
首先,我们使用一个堆来保存每行数据的组合以及它们的和。堆中的每个元素是一个三元组,分别表示当前的和、当前的组合和组合到了哪个位置。初始时,我们将每行第一个元素加入堆中。然后,我们每次从堆中取出当前和最小的元素,将它的下一个元素加入堆中,直到取出了k-1个元素。最后,堆中的第k个元素就是所有组合中的第k小的和。
这个实现的时间复杂度为O(kmnlogk),其中n为每行元素的个数,m为行数。堆的大小为O(k),每次从堆中取出元素和加入元素的时间复杂度为O(logk),因此总时间复杂度为O(kmnlogk)。
阅读全文