[Leetcode]Rotate Image

You are given an n x n 2D matrix representing an image.

Rotate the image by 90 degrees (clockwise).

Follow up:
Could you do this in-place?

利用异或(XOR),实现以不需要temp变量的方式完成交换。

例如:

1     2    3    4

5     6    7    8

9    10  11  12

13  14  15  16 

首先是最外面一圈,最先按顺时针交换的4个数是(把matrix[0][0] = 1存给temp,把matrix[3][0] = 13matrix[0][0],把matrix[3][3] = 16给matrix[3][0],把matrix[0][3] = 4给matrix[3][3],把temp = 1给matrix[0][3]

1                 4


13              16

接着是需要交换的2、9、15、8

1     2          4

                   8

9

13        15  16 

依次往下,把第一圈交换完了,再往里圈走。

class Solution {
public:
    void rotate(vector<vector<int> > &matrix) {
        if(matrix.size() != 1)
        {
            int size = 0; 
            size = (matrix.size() - 1) / 2;
            int n = matrix.size() - 1;           
           
            for(int i = 0; i <= size; i++)
            {
                 
                 for(int j = i; j <= n - 1 - i; j++)
                 {
                    matrix[i][j] ^= matrix[n - j][i];
                    matrix[n - j][i] ^= matrix[i][j];
                    matrix[i][j] ^= matrix[n - j][i];
                    
                    matrix[n - j][i] ^= matrix[n - i][n - j];
                    matrix[n - i][n - j] ^= matrix[n - j][i];
                    matrix[n - j][i] ^= matrix[n - i][n - j];
                    
                    matrix[n - i][n - j] ^= matrix[j][n - i];
                    matrix[j][n - i] ^= matrix[n - i][n - j];
                    matrix[n - i][n - j] ^= matrix[j][n - i];
                 }
            }
           
        }
    }
};

代码似乎还是有点冗余,如果各位有更好的解法,希望可以共享·~谢谢啦·~


附:利用temp变量的解法

class Solution {
public:
    void rotate(vector<vector<int> > &matrix) {
        if(matrix.size() != 1)
        {
            int size = 0; 
            size = (matrix.size() - 1) / 2;
            int n = matrix.size() - 1;           
           
            for(int i = 0; i <= size; i++)
            {
                 
                 for(int j = i; j <= n - 1 - i; j++)
                 {
                    int temp = matrix[i][j];
                    matrix[i][j] = matrix[n - j][i];
                    matrix[n - j][i] = matrix[n - i][n - j];
                    matrix[n - i][n - j] = matrix[j][n - i];
                    matrix[j][n - i] = temp;
                 }
            }
           
        }
    }

注:以上两解法,在Leetcode上,运行时间均为12ms。



本文不详尽或错误之处,请各位不吝言辞,多多指教~谢谢~

             作者:Louise http://blog.csdn.net/yupingliu






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值