
2025-08-15:按对角线进行矩阵排序。用go语言,给你一个 n × n 的整数矩阵,要求返回一个按下面规则调整后的矩阵:
最终返回按上述方式重排后的矩阵。
grid.length == grid[i].length == n。
1 <= n <= 10。
-100000 <= grid[i][j] <= 100000。
输入: grid = [[0,1],[1,2]]。
输出: [[2,1],[1,0]]。
解释:
标有黑色箭头的对角线必须按非递增顺序排序,因此 [0, 2] 变为 [2, 0]。其他对角线已经符合要求。
题目来自力扣3446。
package main
import (
"fmt"
"slices"
)
func sortMatrix(grid [][]int) [][]int {
m, n := len(grid), len(grid[0])
// 第一排在右上,最后一排在左下
// 每排从左上到右下
// 令 k=i-j+n,那么右上角 k=1,左下角 k=m+n-1
for k := 1; k < m+n; k++ {
// 核心:计算 j 的最小值和最大值
minJ := max(n-k, 0) // i=0 的时候,j=n-k,但不能是负数
maxJ := min(m+n-1-k, n-1) // i=m-1 的时候,j=m+n-1-k,但不能超过 n-1
a := []int{}
for j := minJ; j <= maxJ; j++ {
a = append(a, grid[k+j-n][j]) // 根据 k 的定义得 i=k+j-n
}
if minJ > 0 { // 右上角三角形
slices.Sort(a)
} else { // 左下角三角形(包括中间对角线)
slices.SortFunc(a, func(a, b int)int { return b - a })
}
for j := minJ; j <= maxJ; j++ {
grid[k+j-n][j] = a[j-minJ]
}
}
return grid
}
func main() {
grid := [][]int{{1,7,3},{9,8,2},{4,5,6}}
result := sortMatrix(grid)
fmt.Println(result)
}

# -*-coding:utf-8-*-
from typing importList
defsort_matrix(grid: List[List[int]]) -> List[List[int]]:
ifnot grid ornot grid[0]:
return grid
m, n = len(grid), len(grid[0])
# k 从 1 到 m+n-1(包含)
for k inrange(1, m + n):
min_j = max(n - k, 0)
max_j = min(m + n - 1 - k, n - 1)
a = [grid[k + j - n][j] for j inrange(min_j, max_j + 1)]
if min_j > 0:
# 右上角三角形 → 非递减
a.sort()
else:
# 左下角三角形(含主对角线)→ 非递增
a.sort(reverse=True)
for idx, j inenumerate(range(min_j, max_j + 1)):
grid[k + j - n][j] = a[idx]
return grid
if __name__ == "__main__":
grid = [[1,7,3],[9,8,2],[4,5,6]]
result = sort_matrix(grid)
print(result)