给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度
https://leetcode-cn.com/problems/rotate-image/
你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像
示例1:
示例2:
示例3:
示例4:
提示:
Java解法
package sj.shimmer.algorithm.ten_3;
import sj.shimmer.algorithm.Utils;
/**
* Created by SJ on 2021/2/21.
*/
class D28 {
public static void main(String[] args) {
int[][] matrix = {
// new int[]{1, 2, 3},
// new int[]{4, 5, 6},
// new int[]{7, 8, 9},
// new int[]{1, 2, 3, 4},
// new int[]{5, 6, 7, 8},
// new int[]{9, 10, 11, 12},
// new int[]{13, 14, 15, 16},
// new int[]{1, 2, 3, 4, 5},
// new int[]{6, 7, 8, 9, 10},
// new int[]{11, 12, 13, 14, 15},
// new int[]{16, 17, 18, 19, 20},
// new int[]{21, 22, 23, 24, 25},
new int[]{2, 29, 20, 26, 16, 28},
new int[]{12, 27, 9, 25, 13, 21},
new int[]{32, 33, 32, 2, 28, 14},
new int[]{13, 14, 32, 27, 22, 26},
new int[]{33, 1, 20, 7, 21, 7},
new int[]{4, 24, 1, 6, 32, 34},
};
rotate(matrix);
for (int[] ints : matrix) {
Utils.logArray(ints);
}
}
public static void rotate(int[][] matrix) {
if (matrix == null || matrix.length == 1) {
return;
}
int length = matrix.length;
for (int k = 0; k < length / 2 + 1; k++) { //需要遍历的圈数 length/2
for (int i = k; i < length - 1 - k; i++) {
int temp = matrix[k][i];
matrix[k][i] = matrix[length - 1 - i][k];
matrix[length - 1 - i][k] = matrix[length - 1 - k][length - 1 - i];
matrix[length - 1 - k][length - 1 - i] = matrix[i][length - 1 - k];
matrix[i][length - 1 - k] = temp;
}
}
}
}
官方解
-
使用辅助数组
- 时间复杂度:O(N^2)
- 空间复杂度:O(N^2)
-
原地旋转
- 时间复杂度:O(N^2)
- 空间复杂度:O(1)
-
用翻转代替旋转
- 时间复杂度:O(N^2)
- 空间复杂度:O(1)