模拟算法

122 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路

旋转矩阵

有一个NxN整数矩阵,请编写一个算法,将矩阵顺时针旋转90度。

给定一个NxN的矩阵,和矩阵的阶数N,请返回旋转后的NxN矩阵。

数据范围:img,矩阵中的值满足 img

要求:空间复杂度 img,时间复杂度 img

进阶:空间复杂度 img,时间复杂度 img

示例1

输入

 [[1,2,3],[4,5,6],[7,8,9]],3 

输出

 [[7,4,1],[8,5,2],[9,6,3]]
 import java.util.*;
 ​
 public class Solution {
     public int[][] rotateMatrix(int[][] mat, int n) {
         // write code here
         rotate(mat);
         return mat;
     }
     static public void rotate(int [][] matrix) {
         int a = 0;
         int b = 0;
         int c = matrix.length-1;
         int d = matrix[0].length-1;
         while(a<c) {
             rotateEdge(matrix,a++,b++,c--,d--);
         }
     }
     static public void rotateEdge(int [][] matrix,int a,int b,int c,int d) {
         int temp = 0;
         for(int i=0;i<d-b;i++) {
             temp = matrix[a][b+i];
             matrix[a][b+i] = matrix[c-i][b];
             matrix[c-i][b] = matrix[c][d-i];
             matrix[c][d-i] = matrix[a+i][d];
             matrix[a+i][d] = temp;
         }
     }
 }

旋转矩阵(扩展1)

先从最外圈由左往右遍历,往下,往左,最后往上,进入下一圈

输入3 4

1 2 3 4

5 6 7 8

9 10 11 12

输出 1 2 3 4 8 12 11 10 9 5 6 7 8

 import java.util.*;
 ​
 public class Solution {
     static Scanner sc = new Scanner(System.in);
 ​
     public static void main(String[] args) {
         int n = sc.nextInt();
         int m = sc.nextInt();
         int[][] matrix = new int[n][m];
         for (int i = 0; i < n; i++) {
             for (int j = 0; j < m; j++)
                 matrix[i][j] = sc.nextInt();
         }
         lessen(matrix);
     }
 ​
     static void lessen(int matrix[][]) {
         int a = 0;
         int b = 0;
         int c = matrix.length-1;
         int d = matrix[0].length-1;
         while (b <= d && a <= c) {
             toPrint(matrix, a++, b++, c--, d--);
         }
     }
 ​
     static void toPrint(int[][] matrix, int a, int b, int c, int d) {
         for (int i = b; i < d; i++)
             System.out.print(matrix[a][i]);
         for (int i = a; i < c; i++)
             System.out.print(matrix[i][d]);
         for (int i = d; i > b; i--)
             System.out.print(matrix[c][i]);
         for (int i = c; i > a; i--)
             System.out.print(matrix[i][b]);
     }
 }

旋转矩阵(扩展2)

先斜往上遍历,后斜往下遍历,又斜往上遍历

输入3 4

1 2 3 4

5 6 7 8

9 10 11 12

输出

1 5 2 3 6 9 10 7 4 8 11 12

 import java.util.*;
 ​
 public class Solution {
     static Scanner sc = new Scanner(System.in);
 ​
     public static void main(String[] args) {
         int n = sc.nextInt();
         int m = sc.nextInt();
         int[][] matrix = new int[n][m];
         for (int i = 0; i < n; i++) {
             for (int j = 0; j < m; j++)
                 matrix[i][j] = sc.nextInt();
         }
         rotate(matrix);
     }
     static void rotate(int [][] matrix) {
         int a,b,c,d;
         a = b = c = d = 0;
         int n = matrix.length-1;
         int m = matrix[0].length-1;
         int flag = 1;//1  表示斜向下,-1表示斜向上
         while(a<=n && b<=m) {
             toRotate(matrix,a,b,c,d,flag);
             if(b<m) b++;
             else a++;
             if(c<n) c++;
             else d++;
             flag *= -1;
         }
     }
     static void toRotate(int [][] matrix,int a,int b,int c,int d,int flag) {
         if(flag == 1) {
             for(int i=a,j=b;i<=c&&j>=d;i++,j--)
                 System.out.println(matrix[i][j]);
         }
         else {
             for(int i=c,j=d;i>=a&&j<=b;i--,j++) {
                 System.out.println(matrix[i][j]);
             }
         }
     }
     
 }

\