旋转正方形矩阵

2022-05-13 10:01:03 浏览数 (1)

【题目】 给定一个整型正方形矩阵matrix,请把该矩阵调整成顺时针旋转90度的样子。

【要求】 额外空间复杂度为O(1)。

思想和转圈打印矩阵,差不多,从外圈到内圈逐层的转换,对于一个正方形边框我们只需要移动最上面那个框上的点,带动整个框上的点移动即可.

代码

扣边界还是非常烦人的,晕乎乎

代码语言:javascript复制
package com.day1.practice;

import java.time.temporal.Temporal;

public class RotatingSquareMatrix {

    public static void Rotate(int[][] SquareMatrix){
        int tR=0;//矩阵左上角的行坐标
        int tC=0;//矩阵左上角的列左边
        int dR=SquareMatrix.length-1;   //矩阵右下角的行坐标
        int dC=SquareMatrix[0].length-1;//矩阵右下角的列左边
        while (tR<=dR&&tC<=dC){
            RotateEdge(SquareMatrix,tR,tC,dR,dC);
            tR  ;tC  ;
            dR--;dC--;
        }
    }
    //         {   1, 2,  3,  4   },
    //         {   5, 6,  7,  8   },
    //         {   9, 10, 11, 12  },
    //         {   13,14, 15, 16  }
    //          (tR,tC)
    //
    //
    //
    //                      (dR,dC)
    public static void RotateEdge(int[][] sm,int tR,int tC,int dR,int dC){
        for(int i=0;i<dC-tC;i  ){
            int temp=sm[tR][tC i];//temp存上面点的值
            sm[tR][tC i]= sm[dR-i][tC];//用左边点的值覆盖上面点√
            sm[dR-i][tC]=sm[dR][dC-i];//用下边点的值覆盖左面点√
            sm[dR][dC-i]=sm[tR i][dC];//用右边点的值覆盖下面点√
            sm[tR i][dC]=temp;//用临时存储的上边点的值覆盖右面点√
        }
    }
//test
    public static void main(String[] args){
        int [][] matrix = {
                {   1, 2,  3,  4   },
                {   5, 6,  7,  8   },
                {   9, 10, 11, 12  },
                {   13,14, 15, 16  }
        };
        Rotate(matrix);
        for(int i=0;i<matrix.length;i  ){
          for(int j=0;j<matrix.length;j  ){
              System.out.print(matrix[i][j] " ");
          }
              System.out.println();
        }
    }

}

0 人点赞