一道很简单的题目,但挑战的要求是在原地完成。
题目:原题地址
给定一个N×N的二维矩阵表示图像,90度顺时针旋转图像。
样例
给出一个矩形[[1,2],[3,4]],90度顺时针旋转后,返回[[3,1],[4,2]]
标签
分析:这题如果要借助额外的空间,超级简单。这里不做描述
若不借助额外空间,我们可以这样做:
1.上下对称翻转
2.以左上、右下对角线,做翻转
做完上面两个翻转操作后,你会惊奇的发现,数组已经变成我们需要的结果了
这里肯定会有人问了,你要交换,难道不需要额外空间吗?
答案是不需要。
因为将a,b两个数交换。
可以这样做:
1.a += b;
2.b = a - b;
3.a = a - b;
这样a,b就完成了交换,并且没有使用辅助空间来完成交换
最后全部的代码如下:
public void rotate(int[][] matrix) {
// write your code here
if (matrix.length == 1)
return;
for (int i = 0; i < matrix.length / 2; i++) {
for (int j = 0; j < matrix.length; j++) {
// 上下对称
matrix[i][j] += matrix[matrix.length - i - 1][j];
matrix[matrix.length - i - 1][j] = matrix[i][j] - matrix[matrix.length - i - 1][j];
matrix[i][j] = matrix[i][j] - matrix[matrix.length - i - 1][j];
}
}
for (int i = 0; i < matrix.length; i++) {
for (int j = i + 1; j < matrix.length; j++) {
// 对角线对称
matrix[i][j] += matrix[j][i];
matrix[j][i] = matrix[i][j] - matrix[j][i];
matrix[i][j] = matrix[i][j] - matrix[j][i];
}
}
}
最后附上一张AC图~