• 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
  • 相关阅读:
    深度神经网络的优化算法
    Python 正则表达式
    《java面试十八式》第一式 --冈本零点零一
    《java面试十八式》--引子
    Redis第二讲【Redis基本命令和五大数据结构】
    redis第一讲【redis的描述,linux和docker下的安装使用】
    springboot中的pom文件是如何管理依赖的
    详谈springboot启动类的@SpringBootApplication注解
    工具类中注入service和dao
    windows下安装ssdb
  • 原文地址:https://www.cnblogs.com/cing/p/9212299.html
Copyright © 2020-2023  润新知