leetcode刷题——之旋转矩阵-CSDN博客

@二维数组旋转

题目说明

给你一幅由 N × N 矩阵表示的图像,其中每个像素的大小为 4 字节。请你设计一种算法,将图像旋转 90 度。

不占用额外内存空间能否做到?

示例

给定 matrix =
[
  [1, 2, 3, 4],
  [ 5, 6, 7, 8],
  [9,10,11,12],
  [13,14,15,16]
], 

原地旋转输入矩阵,使其变为:
[
  [13,9,5,1],
  [14,10,6,2],
  [15,11,7,3],
  [16,12,8,4]
]

思路

通过观察我们发现:
原来第i列,第j行,变成了第j列,第n-i行;行号就是原来的列号,单列号是与之前行号互补的
于是上下翻转目的是将互补变成相同,然后i和j就可以互换了,也就是对角线翻转。

 1  2  3  4                  13 14 15 16
 5  6  7  8                  9  10 11 12
------------   =水平翻转=>   ------------
 9  10 11 12                 5  6  7  8
 13 14 15 16                 1  2  3  4
                 				 


15 14 12 16                   15 13  2  5
13  3  6  7   =主对角线翻转=>   14  3  4  1
 2  4  8 10                   12  6  8  9
 5  1  9 11                   16  7 10 11

题解

先上下翻转再对称翻转,需要写两个嵌套循环。

这道题题目中要求说不能占用额外空间,就是不能用辅助数组来帮助旋转,但可以通过定义少个变量来实现
如下:(用a来临时存储)

for(j = 0;j<n;j++){
     
                int a = matrix[i][j];
                matrix[i][j] = matrix[n-i-1][j];
                matrix[n-i-1][j] = a;       
            }
        }
    

java代码

// An highlighted block

class Solution {
     
    public void rotate(int[][] matrix) {
     
        int i;
        int j;
        int n = matrix.length;
        for(i = 0;i<n/2;i++){
     
            for(j = 0;j<n;j++){
     
                int a = matrix[i][j];
                matrix[i][j] = matrix[n-i-1][j];
                matrix[n-i-1][j] = a;       
            }
        }
        for(i = 0;i<n;i++){
     
            for(j = 0;j<i;j++){
     
                int b = matrix[i][j];
                matrix[i][j] = matrix[j][i];
                matrix[j][i] = b;
            }
        }
    }
}

你可能感兴趣的:(二维数组,leetcode,算法,java)