タイトル説明
与えられたn×nの2次元行列行列は画像を表します。画像を時計回りに90度回転させてください。
画像を所定の位置で回転させる必要があります。つまり、入力された2次元行列を直接変更する必要があります。画像を回転させるために別のマトリックスを使用しないでください。
例1:
入力:行列= [[1,2,3]、[4,5,6]、[7,8,9]]
出力:[[7,4,1]、[8,5,2]、[9 、6,3]]
例2:
入力:行列= [[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]]
例3:
入力:matrix = [[1]]
出力:[[1]]
例4:
入力:行列= [[1,2]、[3,4]]
出力:[[3,1]、[4,2]]
問題解決のアイデア
補助アレイを使用する
/**
* 使用辅助数组
* @param matrix
*/
public void rotate_1(int[][] matrix) {
int n = matrix.length;
int[][] matrix_new = new int[n][n];
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
matrix_new[j][n - i - 1] = matrix[i][j];
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
matrix[i][j] = matrix_new[i][j];
}
}
}
所定の位置で回転します
/**
* 原地旋转
*/
public void rotate_2(int[][] matrix) {
int n = matrix.length;
for (int i = 0; i < n / 2; i++) {
for (int j = 0; j < (n + 1) / 2; j++) {
int temp = matrix[i][j];
matrix[i][j] = matrix[n - j - 1][i];
matrix[n - j - 1][i] = matrix[n - i - 1][n - j - 1];
matrix[n - i - 1][n - j - 1] = matrix[j][n - i - 1];
matrix[j][n - i - 1] = temp;
}
}
}
回転する代わりにフリップを使用する
/**
* 用翻转代替旋转
*/
public void rotate(int[][] matrix) {
int n = matrix.length;
// 水平翻转
for (int i = 0; i < n / 2; ++i) {
for (int j = 0; j < n; ++j) {
int temp = matrix[i][j];
matrix[i][j] = matrix[n - i - 1][j];
matrix[n - i - 1][j] = temp;
}
}
// 主对角线翻转
for (int i = 0; i < n; ++i) {
for (int j = 0; j < i; ++j) {
int temp = matrix[i][j];
matrix[i][j] = matrix[j][i];
matrix[j][i] = temp;
}
}
}