1. 问题描述:
给定一个 n × n 的二维矩阵表示一个图像。
将图像顺时针旋转 90 度。
说明:
你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像。
示例 1:
给定 matrix =
[
[1,2,3],
[4,5,6],
[7,8,9]
],
原地旋转输入矩阵,使其变为:
[
[7,4,1],
[8,5,2],
[9,6,3]
]
示例 2:
给定 matrix =
[
[ 5, 1, 9,11],
[ 2, 4, 8,10],
[13, 3, 6, 7],
[15,14,12,16]
],
原地旋转输入矩阵,使其变为:
[
[15,13, 2, 5],
[14, 3, 4, 1],
[12, 6, 8, 9],
[16, 7,10,11]
]
2. 思路分析:
① 根据矩阵旋转的特点可以知道,旋转之后的图像行数是从最后一行往上,列数是从第一列开始,我最开始的想法是使用一个字符串来拼接转置后的数字,然后将字符串的数字转变后存储到原数组中,但是感觉还是有点麻烦
② 在官方提供的代码中可以知道可以先对矩阵进行转置,然后对每一行中以行的中间元素为界限交换左右两边的元素使其达到原地旋转数组的目的
3. 代码如下:
我自己写的:
import java.util.Scanner;
public class Solution {
public static void rotate(int[][] matrix) {
String s = "";
for (int i = 0; i < matrix[0].length; ++i){
for (int j = matrix.length - 1; j >= 0; --j){
/*i表示的是列, j表示的是行*/
s += matrix[j][i] + " ";
}
}
int count = 0, r = matrix.length, c = matrix[0].length;
String t = "";
for (int i = 0; i < s.length(); ++i){
char c1 = s.charAt(i);
if (c1 != ' ') t += c1;
else {
//通过元素个数计算出二维数组的位置
matrix[count / c][count - c * (count / c)] = Integer.parseInt(t);
count++;
t = "";
}
}
}
}
转置数组进行每一行元素的旋转的:
class Solution {
public void rotate(int[][] matrix) {
int n = matrix.length;
// transpose matrix
for (int i = 0; i < n; i++) {
for (int j = i; j < n; j++) {
int tmp = matrix[j][i];
matrix[j][i] = matrix[i][j];
matrix[i][j] = tmp;
}
}
// reverse each row
for (int i = 0; i < n; i++) {
for (int j = 0; j < n / 2; j++) {
int tmp = matrix[i][j];
matrix[i][j] = matrix[i][n - j - 1];
matrix[i][n - j - 1] = tmp;
}
}
}
}