给定一个 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]]
解题思路
1、由观察可知,将原图像顺时针选择90度,等价于a、将矩阵沿对角线翻转。b、再将矩阵沿中心轴翻转
如下所示的图像
a、沿着对角线翻转之后
b、沿着中心轴翻转之后
Java代码
class Solution {
public void rotate(int[][] matrix) {
// 获取矩阵的长和宽
int m = matrix.length;
int n = matrix[0].length;
for(int i=0; i<m; i++){
for(int j=i+1; j<n; j++){
swap(matrix, i, j, j, i);
}
}
for(int[] row:matrix){
revserRow(row);
}
}
// 函数功能,交换矩阵中的两个数grid[x0][y0] -> grid[x1][y1]
// grid[x1][y1] -> grid[x0][y0]
public void swap(int[][]matrix, int x0, int y0, int x1, int y1){
int tmp = matrix[x0][y0];
matrix[x0][y0] = matrix[x1][y1];
matrix[x1][y1] = tmp;
}
// 函数功能:交换同一行中的两个数
// row[i] -> row[j], row[j] -> row[i]
public void swap(int[]row, int i, int j){
int tmp = row[i];
row[i] = row[j];
row[j] = tmp;
}
// 函数功能:颠倒某一行
// [1, 2, 3, 4] -> [4, 3, 2, 1]
public void revserRow(int[] row){
for(int i=0; i<row.length / 2; i++){
swap(row, i, row.length-i-1);
}
}
}
Python代码
class Solution(object):
def rotate(self, matrix):
"""
:type matrix: List[List[int]]
:rtype: None Do not return anything, modify matrix in-place instead.
"""
# 获取矩阵的长和宽
m = len(matrix)
n = len(matrix[0])
for i in range(m):
for j in range(i+1, n):
self.swap2(matrix, i, j, j, i)
for row in matrix:
self.reverseRow(row)
# 函数功能,交换矩阵中的两个数grid[x0][y0] -> grid[x1][y1]
# grid[x1][y1] -> grid[x0][y0]
def swap2(self, matrix, x0, y0, x1, y1):
tmp = matrix[x0][y0]
matrix[x0][y0] = matrix[x1][y1]
matrix[x1][y1] = tmp
# 函数功能:交换同一行中的两个数
# row[i] -> row[j], row[j] -> row[i]
def swap(self, row, i, j):
tmp = row[i]
row[i] = row[j]
row[j] = tmp
# 函数功能:颠倒某一行
# [1, 2, 3, 4] -> [4, 3, 2, 1]
def reverseRow(self, row):
for i in range(0, len(row) / 2):
self.swap(row, i, len(row) - i - 1)