问题复述:
给定一个 n × n 的二维矩阵表示一个图像。
将图像顺时针旋转 90 度。
说明:
你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像。
示例 1:
给定 matrix = [ [1,2,3], [4,5,6], [7,8,9] ], 原地旋转输入矩阵,使其变为: [ [7,4,1], [8,5,2], [9,6,3] ]
困难点:
难度在于不能申请额外的空间,如果能有新的空间就会简单很多
解法二是一种纯数学的方法,对应元素替换,循环刚刚好完成。flag都不用。。。实属大神代码
代码:
package top_interview_q_easy.array;
import java.util.Arrays;
public class crossImage {
//暴力解法,不是原地算法,使用了一个转换二维数组
public int[][] crossimage(int[][] image) {
int[][] temp = new int[image.length][image[0].length];
for (int j = 0; j < image[0].length; j++) {
for (int i = image[0].length - 1; i >= 0; i--) {
temp[j][image[0].length - i - 1] = image[i][j];
}
}
return temp;
}
public void crossimage_1(int[][] matrix) {
//刚刚好的循环...一切都刚刚好
if(matrix == null){
return;
}
int n = matrix.length;
for(int i=0; i<n/2; i++){
for(int j=i; j<n-1-i; j++){
int temp = matrix[i][j];
matrix[i][j]=matrix[n-1-j][i];
matrix[n-1-j][i]=matrix[n-1-i][n-1-j];
matrix[n-1-i][n-1-j]=matrix[j][n-1-i];
matrix[j][n-1-i]=temp;
}
}
}
public static void main(String[] args){
int[][] test = new int[][]{{5, 1, 9, 11}, {2, 4, 8, 10}, {13, 3, 6, 7}, {15, 14, 12, 16}};
crossImage ss = new crossImage();
int[][] out = ss.crossimage(test);
System.out.println(Arrays.deepToString(out));
}
}