美文网首页
找规律-旋转图像

找规律-旋转图像

作者: 今夜秋风和 | 来源:发表于2024-07-19 20:49 被阅读0次

旋转图像

https://leetcode.cn/problems/rotate-image/

题目分析

基于翻转实现原地旋转

1.翻转形式一上下翻转

截屏2024-07-14 下午2.34.52.png

2.翻转形式二-左右翻转

截屏2024-07-14 下午2.40.30.png

3.翻转形式三-正向对角线翻转

4.翻转形式四-反向对角线翻转

截屏2024-07-14 下午3.09.24.png

顺时针90度旋转可以看为上下翻转+ 正向对角线翻转

基于翻转实现

    public void rotate(int[][] matrix) {
        if(matrix == null || matrix.length <= 0){
            return ;
        }

        /**
         基于翻转实现
         1. 先上下交换
         2. 然后对角线交换
         */
        for(int i = 0;i< matrix.length/2;i++){
            for(int j = 0; j < matrix.length;j++){
                int firstNUm = matrix[i][j];
                int newI = matrix.length - i - 1;
                matrix[i][j] = matrix[newI][j];
                matrix[newI][j] = firstNUm;
            }
        }
        //2.然后对角线交换
        for(int i = 0;i< matrix.length;i++){
            int j = 0;
            while(j < matrix.length){
                if(i == j || j > i){
                    break;
                }else{
                    int newI = j;
                    int newJ = i;
                    int firstNum = matrix[i][j];
                    matrix[i][j] = matrix[newI][newJ];
                    matrix[newI][newJ] = firstNum;
                    j++;
                }
            }
        }
   }

基于原地交换实现旋转

首先我们来看顶点的元素位置是怎么移动的,元素1要放到4位置,4要发放到16,16要放到13位置,13要最终放到1位置,这样完成了4个顶点之间的交换,在交换时,可以将1 放到临时变量中,然后沿着图示的方向将13 放到1位置,16 放到13位置,4放入16位置,temp 元素1 放入4位置;

如果可以将每行或每列的元素坐标计算出来, 那么也可以完成上述类似元素之间的交换,所以,我们要找出顶点之间的坐标计算关系;
对于元素2来说,它的坐标可以通过s1 顶点就算出来, 为array[s1_x][s1_j+1];
对于元素8来说,它的坐标可以通过s2顶点计算出来,为array[s2_x+1][s2_j];
对于元素15来说,它的坐标可以通过s3顶点计算出来,为array[s3_x][s3_j-1];
对于元素9来说,它的坐标可以通过s4顶点计算出来,为array[s4_x-1][s4_j],
这样就可以将2,8,15,9这几个元素进行交换,同理,对于绿色标记的这几个元素也可以通过计算坐标出来进行一轮交换;
以上就完成了最外层一圈元素的交换,此时,需要将对应的s1,s2,s3,s4这几个顶点索引递进(s1_x++,s1_j++,s2_x++,s2_j--,s3_x--,s3_j--,s4_x--,s4_j++),进行内层一圈元素的交换;
那么什么时候会退出呢,当s1_j > s2_j 时,即元素全部旋转完毕;


截屏2024-07-14 下午5.34.37.png

基于原地交换实现

    public void rotate(int[][] matrix) {
        if(matrix == null || matrix.length <= 0){
            return ;
        }
              /**
         方法三:基于原地交换
         */
         //四个顶点坐标
         int s1_i = 0;
         int s1_j = 0;
         int s2_i = 0;
         int s2_j = matrix.length - 1;
         int s3_i = matrix.length - 1;
         int s3_j = matrix[0].length - 1;
         int s4_i = matrix.length - 1;
         int s4_j = 0;
         while(s1_j <= s2_j){
            // 每轮交换外层一圈元素,一共需要交换s2_j - s1_j 个元素
            for(int i = 0;i < s2_j - s1_j;i++){
                //基于顶点坐标根据偏移量计算该行或该列其他元素坐标
                int p1_i = s1_i;
                int p1_j = s1_j +i;
                int p2_i = s2_i +i;
                int p2_j = s2_j;
                int p3_i = s3_i;
                int p3_j = s3_j-i;
                int p4_i = s4_i-i;
                int p4_j = s4_j;
                swap(p1_i,p1_j,p2_i,p2_j,p3_i,p3_j,p4_i,p4_j,matrix);
            }
            //外层一圈元素交换完毕后
            s1_i++;
            s1_j++;
            s2_i++;
            s2_j--;
            s3_i--;
            s3_j--;
            s4_i--;
            s4_j++;
         }
    }
    /**
     最外圈中各个顶点元素交换
     */
    private void swap(int p1_i,int p1_j,int p2_i,int p2_j,int p3_i,int p3_j,int p4_i,int p4_j,int[][] array){
        int temp = array[p1_i][p1_j];
        array[p1_i][p1_j] = array[p4_i][p4_j];
        array[p4_i][p4_j] = array[p3_i][p3_j];
        array[p3_i][p3_j] = array[p2_i][p2_j];
        array[p2_i][p2_j] = temp;
    }
}

相关文章

  • android tween补间动画

    如果动画中的图像变化比较有规律时,可以采用自动生成中间图像的方式来生成图像,例如图像的移动,旋转,缩放等再比如有正...

  • 旋转图像

    一个n x n的二维矩阵表示一个图像,将图像顺时针旋转90度。要求in-place,所以就不能用额外的空间了。 解...

  • 旋转图像

    给定一个 n × n 的二维矩阵表示一个图像。 将图像顺时针旋转 90 度。 说明: 你必须在原地旋转图像,这意味...

  • 旋转图像

    题目来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/rota...

  • 旋转图像

    给定一个 n × n 的二维矩阵表示一个图像。 将图像顺时针旋转 90 度。 说明: 你必须在原地旋转图像,这意味...

  • 旋转图像

    更多精彩内容,请关注【力扣中等题】。 题目 难度:★★★☆☆类型:二维矩阵,几何方法:矩阵操作 给定一个 n × ...

  • 旋转图像

    给定一个 n × n 的二维矩阵表示一个图像。 将图像顺时针旋转 90 度。 说明: 你必须在原地旋转图像,这意味...

  • 旋转图像

    给定一个 *n *× n 的二维矩阵表示一个图像。 将图像顺时针旋转 90 度。 说明: 你必须在原地旋转图像,这...

  • 图像旋转

    题目需求 给定一个 n × n 的二维矩阵表示一个图像。将图像顺时针旋转 90 度。说明:你必须在原地旋转图像,这...

  • 旋转图像

    给定一个 n × n 的二维矩阵表示一个图像。 将图像顺时针旋转 90 度。 说明: 你必须在原地旋转图像,这意味...

网友评论

      本文标题:找规律-旋转图像

      本文链接:https://www.haomeiwen.com/subject/hklqhjtx.html