使用kotlin解决这个问题:1439. 有序矩阵中的第 k 个最小数组和 给你一个 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 09:15:47 浏览: 121
两个有序数序列中找第k小(必做)
```kotlin
import java.util.*
class Solution {
fun kthSmallest(mat: Array<IntArray>, k: Int): Int {
val m = mat.size
val n = mat[0].size
var sum = 0
for (i in 0 until n) {
sum += mat[0][i]
}
val pq = PriorityQueue<Int>()
pq.add(sum)
for (i in 1 until m) {
val pq2 = PriorityQueue<Int>()
while (!pq.isEmpty()) {
val temp = pq.poll()
for (j in 0 until n) {
val s = temp - mat[i - 1][j] + mat[i][j]
if (pq2.size < k) {
pq2.add(s)
} else if (s < pq2.peek()) {
pq2.poll()
pq2.add(s)
}
}
}
pq.addAll(pq2)
}
return pq.poll()
}
}
```
我们首先计算第一行的元素和,并将其添加到一个最小堆中。然后我们遍历每一行,对于每一行中的每个元素,我们都从最小堆中取出当前和最小的数组,然后将当前元素加入该数组并计算新的数组和。我们将新的和加入一个新的最小堆中,用于下一次迭代。我们重复这个过程,直到遍历完所有行,最后取出堆顶元素即可。
时间复杂度为O(k * m * log(k)),空间复杂度为O(k)。
阅读全文