🚩传送门:牛客题目
力扣题目

题目

有一个 [NC]18. 顺时针旋转矩阵 90°/ 旋转图像 - 图1 整数矩阵,请编写一个算法,将矩阵顺时针旋转 90度 。请返回旋转后的 [NC]18. 顺时针旋转矩阵 90°/ 旋转图像 - 图2 矩阵。

进阶:空间复杂度 [NC]18. 顺时针旋转矩阵 90°/ 旋转图像 - 图3,时间复杂度 [NC]18. 顺时针旋转矩阵 90°/ 旋转图像 - 图4

示例1

输入:[[1,2,3],[4,5,6],[7,8,9]],3 返回值:[[7,4,1],[8,5,2],[9,6,3]]

解题思路:交换+翻转

我们以下面示例
[NC]18. 顺时针旋转矩阵 90°/ 旋转图像 - 图5

作为例子,先将其通过水平轴翻转得到:

[NC]18. 顺时针旋转矩阵 90°/ 旋转图像 - 图6或者[NC]18. 顺时针旋转矩阵 90°/ 旋转图像 - 图7

再根据副对角线翻转得到:

[NC]18. 顺时针旋转矩阵 90°/ 旋转图像 - 图8或者[NC]18. 顺时针旋转矩阵 90°/ 旋转图像 - 图9

复杂度分析

时间复杂度: [NC]18. 顺时针旋转矩阵 90°/ 旋转图像 - 图10 ,该方法需要遍历一次二维数组所有元素 。

空间复杂度:[NC]18. 顺时针旋转矩阵 90°/ 旋转图像 - 图11 ,该方法使用常数空间 。

我的代码

  1. class Solution {
  2. public void rotate(int[][] matrix) {
  3. int n = matrix.length;
  4. int[][] matrix_new = new int[n][n];
  5. // 上下水平翻转
  6. for (int i = 0; i < n; ++i) {
  7. for (int j = 0; j < n; ++j) {
  8. matrix_new[j][n - i - 1] = matrix[i][j];
  9. }
  10. }
  11. // 主对角线翻转
  12. for (int i = 0; i < n; ++i) {
  13. for (int j = 0; j < n; ++j) {
  14. matrix[i][j] = matrix_new[i][j];
  15. }
  16. }
  17. }
  18. }

解题思路:交换

通过观察,我们发现主要要循环的将 [NC]18. 顺时针旋转矩阵 90°/ 旋转图像 - 图12 旋转到 [NC]18. 顺时针旋转矩阵 90°/ 旋转图像 - 图13 的位置,即可得到最终旋转 90 度的结果。

复杂度分析

时间复杂度: [NC]18. 顺时针旋转矩阵 90°/ 旋转图像 - 图14 ,该方法需要遍历一次二维数组所有元素 。

空间复杂度:[NC]18. 顺时针旋转矩阵 90°/ 旋转图像 - 图15 ,该方法使用新的二维数组空间 。

我的代码

  1. public int[][] rotateMatrix(int[][] mat, int n) {
  2. int[][] temp = new int[n][n];//新建temp对象,作为最终返回的对象
  3. for(int i = 0;i < n;i++){
  4. for(int j = 0;j < n;j++){
  5. temp[j][n-1-i] = mat[i][j];//直接交换
  6. }
  7. }
  8. return temp;
  9. }