Leetcode.48 旋转图像

给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。

你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。

示例 1:

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

示例 2:

输入:matrix = [[5,1,9,11],[2,4,8,10],[13,3,6,7],[15,14,12,16]]
输出:[[15,13,2,5],[14,3,4,1],[12,6,8,9],[16,7,10,11]]

提示:

  • n == matrix.length == matrix[i].length
  • 1 <= n <= 20
  • -1000 <= matrix[i][j] <= 1000

牛了逼了,两次翻转达成目标

1
2
3
4
5
6
7
8
9
10
11
12
13
14
func rotate(matrix [][]int) { 
n := len(matrix)
// 水平翻转
for i := 0; i < n/2; i++ {
matrix[i], matrix[n-1-i] = matrix[n-1-i], matrix[i]
}

// 主对角线翻转
for i := 0; i < n; i++ {
for j := 0; j < i; j++ {
matrix[i][j], matrix[j][i] = matrix[j][i], matrix[i][j]
}
}
}

标准解法
由于矩阵中的行列从 000 开始计数,因此对于矩阵中的元素 matrix[row][col],在旋转后,它的新位置为 matrix_new[col][n−row−1]。
然后用辅助数组存储翻转后的结果。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
func rotate(matrix [][]int) { 
n := len(matrix)
tmp := make([][]int, n)
for i := range tmp {
tmp[i] = make([]int, n)
}

for i, row := range matrix {
for j, v := range row {
tmp[j][n-1-i] = v
}
}
copy(matrix, tmp) // 拷贝 tmp 矩阵每行的引用
}