LC每日一题|20240429 - 1329. 将矩阵按对角线排序
矩阵对角线 是一条从矩阵最上面行或者最左侧列中的某个元素开始的对角线,沿右下方向一直到矩阵末尾的元素。例如,矩阵
mat有6行3列,从mat[2][0]开始的 矩阵对角线 将会经过mat[2][0]、mat[3][1]和mat[4][2]。给你一个
m * n的整数矩阵mat,请你将同一条 矩阵对角线 上的元素按升序排序后,返回排好序的矩阵。
提示:
m == mat.lengthn == mat[i].length1 <= m, n <= 1001 <= mat[i][j] <= 100
题目等级:Medium
解题思路
一道非常简单的搬砖题。
观察易知,在矩阵内的所有同一条对角线上其横纵坐标差值是相同的,所以我们只需要遍历整个矩阵,将同一对角线内的数值放在一起排序,然后再一个个的塞回去即可。
AC代码
class Solution {
fun diagonalSort(mat: Array<IntArray>): Array<IntArray> {
val list = Array<ArrayList<Int>>(mat.size + mat[0].size - 1) { arrayListOf() }
for (i in mat.indices) for (j in mat[i].indices) list[i - j + mat[0].size - 1].add(mat[i][j])
list.forEach { it.sort() }
val position = IntArray(mat.size + mat[0].size - 1)
for (i in mat.indices) for (j in mat[i].indices) {
mat[i][j] = list[i - j + mat[0].size - 1][position[i - j + mat[0].size - 1]]
position[i - j + mat[0].size - 1] ++
}
return mat
}
}
时间复杂度:O(mnlogmn),需要遍历整个矩阵并排序。
空间复杂度:O(mn),需要放置整个矩阵。