LeetCode刷题笔记—48旋转图像

    科技2022-08-21  99

    No48:旋转图像

    题目思路代码

    题目

    题目

    思路

    ①首先看到要求说要求原地旋转,因此不能使用辅助数组进行中间过程的存储,但这个要求也提醒了我们可能会使用交换;

    ②普通情况下,我们可以每一轮将最外层的“外壳”进行旋转,然后逐层向内循环,一直到没有内层矩阵为止,这方面的题解很多: 逐层递进法

    ③我思考的时候想到矩阵旋转其实本质上就是矩阵的乘法运算,再结合可能使用到“交换”的暗示,平移操作本质就是“交换”,因此凑出来了解决方法。

    顺时针旋转90°:先左右轴对称交换,然后再以副对角线为中心进行中心对称交换; 顺时针旋转180°:先主对角线中心对称交换,再副对角线中心对称交换; 逆时针旋转90°:先上下轴对称交换,再副对角线中心对称交换。

    代码

    废话不多说直接上代码: 顺时针旋转90°:

    public void rotate(int[][] matrix) { //先轴对称左右交换,再以副对角线中心对称交换 int n = matrix.length; //左右轴对称交换 for(int i=0;i<n;i++){ int c1 = 0,c2 = n-1; while (c1<c2) swap(matrix,i,c1++,i,c2--); } //副对角线中心对称交换 for (int i=0;i<n-1;i++){ for(int j=n-i-2;j>=0;j--) swap(matrix,i,j,n-j-1,n-i-1); } } private void swap(int[][] matrix,int r1,int c1,int r2,int c2){ int temp = matrix[r1][c1]; matrix[r1][c1] = matrix[r2][c2]; matrix[r2][c2] = temp; }

    顺时针旋转180°:

    public void rotate(int[][] matrix) { //先轴对称左右交换,再以副对角线中心对称交换 int n = matrix.length; //主对角线中心对称交换 for(int i=0;i<n;i++){ for(int j=i+1;j<n;j++) swap(matrix,i,j,j,i); } //副对角线中心对称交换 for (int i=0;i<n-1;i++){ for(int j=n-i-2;j>=0;j--) swap(matrix,i,j,n-j-1,n-i-1); } } private void swap(int[][] matrix,int r1,int c1,int r2,int c2){ int temp = matrix[r1][c1]; matrix[r1][c1] = matrix[r2][c2]; matrix[r2][c2] = temp; }
    Processed: 0.012, SQL: 10