旋转矩阵

题目描述:给你一幅由 N × N 矩阵表示的图像,其中每个像素的大小为 4 字节。请你设计一种算法,将图像旋转 90 度。

不占用额外内存空间能否做到?

难度:中等

实例:
给定 matrix =
[
[1,2,3],
[4,5,6],
[7,8,9]
],

原地旋转输入矩阵,使其变为:
[
[7,4,1],
[8,5,2],
[9,6,3]
]

我的思路:先转置,再倒置:

public class MatrixRotate {
public static void main(String[] args) {
//int[][] m = {{1,2,3},{4,5,6},{7,8,9}};
int[][] m = {{1,2,3,4},{4,5,6,7},{7,8,9,10},{10,11,12,13}};
int[][] result = rotate(m);
System.out.println("before rotate the matrix is:");
print(m);
System.out.println("after rotate,the final result is:");
print(result);
}
public static int[][] rotate(int[][] m){
int[][] n = transfer(m);
int[][] x = invert(n);
return x;
}

public static int[][] transfer(int[][] m){
int[][] n = new int[m.length][m[0].length];
for(int i = 0;i < m.length;i++){
for(int j = 0;j < m[0].length;j++){
n[i][j] = m[j][i];
}
}
return n;
}

public static int[][] invert(int[][] n){
int[][] x = new int[n.length][n[0].length];
for(int i = 0;i < n.length;i++){
for(int j = 0;j < n[0].length;j++){
x[i][j] = n[i][n[0].length - j - 1];
}
}
return x;
}

public static void print(int[][] matrix){
for(int i = 0;i < matrix.length;i++){
for(int j =0;j < matrix[0].length;j++){
System.out.print(matrix[i][j] + " ");
}
System.out.println();
}
}

简化后的实现方法:转置和倒置同时进行

public static void rotate(int[][] m){
for(int i = 0;i < m.length;i++){
for(int j = i;j < m[0].length;j++){
if(i != j){
int temp = m[i][j];
m[i][j] = m[j][i];
m[j][i] = temp;
}
}
}
for(int i = 0;i < m.length;i++){
for(int j = 0;j < m[0].length/2;j++){
int temp = m[i][j];
m[i][j] = m[i][m[0].length - j - 1];
m[i][m[0].length - j - 1] = temp;
}
}
}

暴力解决几乎干翻所有人:

posted @ 2021-03-30 13:37  先破防再敲  阅读(126)  评论(0)    收藏  举报