给定一个 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]]
解题思路
- 先沿对角线翻转,翻转前后坐标映射关系(x, y) -> (n-1-y, n-1-x)
- 两次循环翻转过程中不能重复旋转被调换的坐标,则必须保证翻转前的x坐标不大于翻转前需要调换的x坐标,即x <= n-1-y
- 计算可得 x+y <= n-1
- 沿水平线对折每一行,行坐标映射关系 (x) -> (n-1-x)
- 也要保证对折前行x坐标不大对折前待交换坐标(n-1-x),及 2x <= n - 1 => x < n/2
算法go版
func rotate(matrix [][]int) {
n := len(matrix)
// 45度角对折
for x := 0; x <= n; x++ {
for y := 0; y <= n; y++ {
if x+y <= n-1 {
matrix[x][y], matrix[n-1-y][n-1-x] = matrix[n-1-y][n-1-x], matrix[x][y]
}
}
}
// 上下对折
for x := 0; x < n/2; x++ {
matrix[x], matrix[n-1-x] = matrix[n-1-x], matrix[x]
}
}