zoukankan      html  css  js  c++  java
  • Java实现 LeetCode 48 旋转图像

    48. 旋转图像

    给定一个 n × n 的二维矩阵表示一个图像。

    将图像顺时针旋转 90 度。

    说明:

    你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像。

    示例 1:

    给定 matrix =
    [
    [1,2,3],
    [4,5,6],
    [7,8,9]
    ],

    原地旋转输入矩阵,使其变为:
    [
    [7,4,1],
    [8,5,2],
    [9,6,3]
    ]
    示例 2:

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

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

    PS:
    假设一个5*5的数组,然后我先旋转四个角的元素,这个很简单,简单排序算法中两个元素交换的延申而已。然后我尝试交换下一组元素,我交换完成外圈元素时,发现了很有规律的现象: 当我们把数组值的行列下标对应到坐标系中时,可以将各元素,看做一个点,那么整个坐标系中有四个点(这里不能贴图,建议在纸上画出来,方便理解)。四个点的规律如下:四个点绝对向一个方向移动,且有一个下标保持不变。

    左上角的点,绝对向右移动,
    右上角的点,绝对向下移动,
    右下角的点,绝对向左移动,
    左下角的点,绝对向上移动,
    归纳得到有两个固定不变的值,其对应在第一次旋转中,分别是0和matrix.length。
    剩余两个变化的值也有规律,分别是两个运动轨迹:从0->matrix.length和从matrix.length->0
    提取运动轨迹间的关系,就能通过循环,完成第一圈旋转
    开始内圈旋转的时候,变换固定值,约束内圈,返回到开始的思路,继续旋转

    class Solution {
        public void rotate(int[][] matrix) {
              int abs1 = 0;
            int abs2 = matrix.length - 1;
            int times = 0;
            while (abs1 <= abs2) {
                int p1 = abs1;
                int p2 = abs2;
                while (p1 != abs2) {
                    int temp = matrix[abs1][p1];        //左上
                    matrix[abs1][p1] = matrix[p2][abs1];//左上 = 左下
                    matrix[p2][abs1] = matrix[abs2][p2];//左下 = 右下
                    matrix[abs2][p2] = matrix[p1][abs2];//右下 = 右上
                    matrix[p1][abs2] = temp;            //右上 = 左上
                    p1 += 1;
                    p2 -= 1;
                }
                abs1 += 1;
                abs2 -= 1;
            }
        }
    }
    
  • 相关阅读:
    MyBatis:分页的实现
    Mybatis之配置文件
    Java之创建线程的方式四:使用线程池
    Java之创建线程的方式三:实现Callable接口
    Java之线程通信的应用:经典例题:生产者/消费者问题
    Java之线程通信的方法
    Java之解决线程安全问题的方式三:Lock锁
    Java之同步方法处理实现Runnable接口的线程安全问题
    Java之同步方法处理继承Thread类的线程安全问题
    01 while 循环输入1 2 3 4 5 6 8 9 10
  • 原文地址:https://www.cnblogs.com/a1439775520/p/13075678.html
Copyright © 2011-2022 走看看