LC每日一题|20240429 - 1329. 将矩阵按对角线排序

124 阅读1分钟

LC每日一题|20240429 - 1329. 将矩阵按对角线排序

矩阵对角线 是一条从矩阵最上面行或者最左侧列中的某个元素开始的对角线,沿右下方向一直到矩阵末尾的元素。例如,矩阵 mat63 列,从 mat[2][0] 开始的 矩阵对角线 将会经过 mat[2][0]mat[3][1]mat[4][2]

给你一个 m * n 的整数矩阵 mat ,请你将同一条 矩阵对角线 上的元素按升序排序后,返回排好序的矩阵。

提示:

  • m == mat.length
  • n == mat[i].length
  • 1 <= m, n <= 100
  • 1 <= 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),需要放置整个矩阵。