给定一个 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)


















