给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。你必须在 原地旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像。
- 1 2 3 1 4 7 7 4 1
- 4 5 6 --> 2 5 8 --> 8 5 2
- 7 8 9 3 6 9 9 6 3
- 2: (0,1) -> (1,0)
- 3: (0,2) -> (2,0)
- ...
- 6: (1,2) -> (2,1)
- ...
-
- 7: (0,0) -> (0,2)
- 4: (0,1) -> (0,1)
- 1: (0,2) -> (0,0)
- ...
- 外层循环行,除第0行,每行都循环到 -> 推论出: for(int i = 1; i < nums.length ...
- 内层循环列, 即 for(int j = 0; j < i ...
- - 第1行,需要处理0列
- - 第2行,需要处理0,1列
- 外层循环行,每行都循环到 -> 推论出: for(int i = 0; i <= nums.length/2 ...
- 内层循环列,中间竖轴
- - 列偶数个,有两个中位数,需要处理第一个中位数之前的元素(包含第一个中位数)。 nums.length/2 6/2=3 (0,1,2)
- - 列奇数个,有一个中位数,需要处理中位数之前的元素(不包含中位数)。 但是nums.length/2 例如:7/2=3 (0,1,2) 包含中位数。为了覆盖偶数,奇数也可以出处理一位
- private static int[][] method2(int[][] matrix) {
- for (int i = 1; i < matrix.length; i++) {
- for (int j = 0; j < i; j++) {
- int temp = matrix[i][j];
- matrix[i][j] = matrix[j][i];
- matrix[j][i] = temp;
- }
- }
- for (int i = 0; i < matrix.length; i++) {
- for (int j = 0; j <= matrix.length / 2; j++) {
- int temp = matrix[i][j];
- matrix[i][j] = matrix[i][matrix.length - 1 - j];
- matrix[i][matrix.length - 1 - j] = temp;
- }
- }
- return matrix;
- }