Skip to content

3446.按对角线进行矩阵排序

implementation, https://leetcode.cn/problems/sort-matrix-by-diagonals/

给你一个大小为 n x n 的整数方阵 grid。返回一个经过如下调整的矩阵:

  • 左下角三角形(包括中间对角线)的对角线按 非递增顺序 排序。
  • 右上角三角形 的对角线按 非递减顺序 排序。

示例 1:

输入: grid = [[1,7,3],[9,8,2],[4,5,6]]

输出: [[8,2,3],[9,6,7],[4,5,1]]

解释:

img

标有黑色箭头的对角线(左下角三角形)应按非递增顺序排序:

  • [1, 8, 6] 变为 [8, 6, 1]
  • [9, 5][4] 保持不变。

标有蓝色箭头的对角线(右上角三角形)应按非递减顺序排序:

  • [7, 2] 变为 [2, 7]
  • [3] 保持不变。

示例 2:

输入: grid = [[0,1],[1,2]]

输出: [[2,1],[1,0]]

解释:

img

标有黑色箭头的对角线必须按非递增顺序排序,因此 [0, 2] 变为 [2, 0]。其他对角线已经符合要求。

示例 3:

输入: grid = [[1]]

输出: [[1]]

解释:

只有一个元素的对角线已经符合要求,因此无需修改。

提示:

  • grid.length == grid[i].length == n
  • 1 <= n <= 10
  • -10^5 <= grid[i][j] <= 10^5
python
from typing import List
from collections import defaultdict

class Solution:
    def sortMatrix(self, grid: List[List[int]]) -> List[List[int]]:
        n = len(grid)
        dia_mx = defaultdict(list)
        for i in range(n):
            for j in range(n):
                dia_mx[i - j].append(grid[i][j])

        for key, _ in dia_mx.items():
            if key < 0:
                dia_mx[key].sort()
            else:
                dia_mx[key].sort(reverse=True)

        for i in range(n):
            for j in range(n):
                grid[i][j] = dia_mx[i - j].pop(0)

        return grid

if __name__ == "__main__":
    sol = Solution()
    grid = [[1,7,3],[9,8,2],[4,5,6]]
    print(sol.sortMatrix(grid))