48.Rotate Image

Posted cing

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了48.Rotate Image相关的知识,希望对你有一定的参考价值。

题目链接

题目大意:顺时针一次旋转矩阵。例子如下:

技术分享图片

法一:新开辟一个数组空间,将每一行的数值赋值给每一列。代码如下(耗时3ms):

技术分享图片
 1     public void rotate(int[][] matrix) {
 2         int[][] res = new int[matrix.length][matrix.length];
 3         int k = matrix.length - 1;
 4         //逐行换到逐列
 5         for(int i = 0; i < matrix.length; i++) {
 6             for(int j = 0; j < matrix.length; j++) {
 7                 res[j][k] = matrix[i][j];
 8             }
 9             k--;
10         }
11         //将数值复制回去
12         for(int i = 0; i < matrix.length; i++) {
13             for(int j = 0; j < matrix.length; j++) {
14                 matrix[i][j] = res[i][j];
15             }
16         }
17     }
View Code

法二(借鉴):每一个数换到一个位置,那个位置上的数就会换到其他位置,最后一个数会换到刚开始的那个位置,比如1->3->9->7->1。

技术分享图片所以根据这个换位规律,得到如下代码。代码如下(耗时2ms):

技术分享图片
 1     public void rotate(int[][] matrix) {
 2         int n = matrix.length;
 3         //逐行
 4         for(int i = 0; i < n / 2; i++) {
 5             //每行中需要旋转的数值
 6             for(int j = i; j < n - i - 1; j++) {
 7                 int tmp = matrix[i][j];
 8                 matrix[i][j] = matrix[n - j - 1][i];
 9                 matrix[n - j - 1][i] = matrix[n - i - 1][n - j - 1];
10                 matrix[n - i - 1][n - j - 1] = matrix[j][n - i - 1];
11                 matrix[j][n - i - 1] = tmp;
12             }
13         }
14     }
View Code

法三(借鉴):先根据对角线翻转 一次,然后在根据x轴中线翻转一次,可以得到最终结果。

技术分享图片根据这个规律,得到如下代码。代码如下(耗时3ms):

技术分享图片
 1     public void rotate(int[][] matrix) {
 2         int n = matrix.length;
 3         //沿对角线翻转
 4         for(int i = 0; i < n - 1; i++) {
 5             for(int j = 0; j < n - i; j++) {
 6                 int tmp = matrix[i][j];
 7                 matrix[i][j] = matrix[n - j - 1][n - i - 1];
 8                 matrix[n - j - 1][n - i - 1] = tmp;
 9             }
10         }
11         //沿x轴中线翻转
12         for(int i = 0; i < n / 2; i++) {
13             for(int j = 0; j < n; j++) {
14                 int tmp = matrix[i][j];
15                 matrix[i][j] = matrix[n - i - 1][j];
16                 matrix[n - i - 1][j] = tmp;
17             }
18         }
19     }
View Code

法四(借鉴):先得到其转置矩阵(实际就是根据对角线翻转),然后在根据y轴中线翻转一次,可以得到最终结果。

技术分享图片根据这个规律,得到如下代码。代码如下(耗时3ms):

技术分享图片
 1     public void rotate(int[][] matrix) {
 2         int n = matrix.length;
 3         //得到转置矩阵
 4         for(int i = 0; i < n; i++) {
 5             for(int j = i + 1; j < n; j++) {
 6                 int tmp = matrix[i][j];
 7                 matrix[i][j] = matrix[j][i];
 8                 matrix[j][i] = tmp;
 9             }
10         }
11         //沿y轴中线翻转
12         for(int i = 0; i < n; i++) {
13             for(int  j = 0; j < n / 2; j++) {
14                 int tmp = matrix[i][j];
15                 matrix[i][j] = matrix[i][n - j - 1];
16                 matrix[i][n - j - 1] = tmp;
17             }
18         }
19     }
View Code

 

以上是关于48.Rotate Image的主要内容,如果未能解决你的问题,请参考以下文章

48.Rotate Image

[leetcode] 48. Rotate Image

[leetcode]48. Rotate Image

LeetCode 48. Rotate Image My Submissions Question (矩阵旋转)

48. Rotate Image

48. Rotate Image