LintCode 旋转图像 原地完成

一道很简单的题目,但挑战的要求是在原地完成。

题目:原题地址

给定一个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图~

 

posted @ 2017-09-07 10:09  夏天的冬天  阅读(353)  评论(0编辑  收藏  举报