LeetCode48 旋转图像

问题描述:给定一个 n × n 的二维矩阵表示一个图像,将图像顺时针原地旋转 90 度。
例:给定 matrix =
[
[1,2,3],
[4,5,6],
[7,8,9]
],
原地旋转输入矩阵,使其变为:
[
[7,4,1],
[8,5,2],
[9,6,3]
]
思路

  • 按层旋转单个元素

时间复杂度:o(n2)
空间复杂度:o(1)

  • 转置加翻转

该思想原理为:假如我们把矩阵看成是行构成的,转置加翻转与旋转结果一致。
LeetCode48 旋转图像_第1张图片
时间复杂度:o(n2)
空间复杂度:o(1)

//按层次旋转每个元素
class Solution {
    public void rotate(int[][] matrix) {
        int temp,n = matrix.length;
        for(int i = 0; i < n/2; ++i){//矩阵旋转层次,例如3阶矩阵有1层(里面一个元素不用旋转不算层次);4阶矩阵有2层。
            for(int j = i; j < n-i-1; ++j){//对该层中每个元素按边进行旋转,注意每层的边只旋转n-2i-1个元素,这是由于将每边的尾元素看成是下一条边的首元素
                temp = matrix[i][j];//先记录首行开始旋转的元素
                matrix[i][j] = matrix[n-j-1][i];//左列元素替换到首行对应元素
                matrix[n-j-1][i] = matrix[n-i-1][n-j-1];//尾行元素替换到左列对应元素
                matrix[n-i-1][n-j-1] = matrix[j][n-i-1];//右列元素替换到尾行对应元素
                matrix[j][n-i-1] = temp;//首行元素替换到右列对应元素
            }
        }
    }
}
//转置加列翻转
class Solution {
    public void rotate(int[][] matrix) {
        int temp,n = matrix.length;
        for(int i = 0; i < n; ++i){//转置操作
            for(int j = i+1; j < n; ++j){
                temp = matrix[i][j];
                matrix[i][j] = matrix[j][i];
                matrix[j][i] = temp;
            }
        }
        for(int i = 0; i < n/2; ++i){//列翻转
            for(int j = 0; j < n; ++j){
                temp = matrix[j][i];
                matrix[j][i] = matrix[j][n-i-1];
                matrix[j][n-i-1] = temp;
            }
        }
    }
}

你可能感兴趣的:(Leetcode,java,算法,数据结构)