不额外开空间的情况下旋转(leetcode48)

思路

额外开空间

matrix[i][j] = matrix[n - 1 - j][i];
可以通过map:
mapp[i * n + j] = matrix[n - 1 - j][i];
不太清楚这样做的内存开销

我奇葩的思路

旋转中如果按照matrix[i][j] = matrix[n - 1 - j][i];有的元素不仅仅被替换一次。
发现如:
1 2 3
4 5 6
7 8 9
这样外圈的1,3,9,7它们是循环的
圈子改变本质类似。寻找规律并推广。

正常人的思路

https://www.jianshu.com/p/47435d902635
这个观点中利用了上一步骤中的matrix[i][j] = matrix[n - 1 - j][i]
发现是4个元素进行旋转的与我的结论一致。但我没有利用matrix[i][j] = matrix[n - 1 - j][i]直接由第一个点退出其他三个点。

最后四个循环元素中左上角的元素坐标规律为:
3 * 3 的矩阵,需要旋转2组元素,需要定位到 [0][0], [0][1] 4 * 4
的矩阵,需要旋转4组元素,需要定位到 [0][0], [0][1], [0][2], [1][1] 5 * 5
的矩阵,需要旋转6组元素,需要定位到 [0][0], [0][1], [0][2], [0][3], [1][1], [1][2]
https://www.jianshu.com/p/47435d902635

明显可得外层循序按for(int i = 0; i <n -2 ; i ++)
内层循环for(int j = i; j < n - 2i; j ++)

利用第一阶段思考的结果,使得归纳过程明显更为简洁。

大佬的思路

/*

  • clockwise rotate
  • first reverse up to down, then swap the symmetry
  • 1 2 3 7 8 9 7 4 1
  • 4 5 6 => 4 5 6 => 8 5 2
  • 7 8 9 1 2 3 9 6 3
    */
    将matrix中行的顺序逆转后。只需将xy坐标轴对调。

代码

我的代码

class Solution {
public:
    void rotate(vector<vector<int>>& matrix) {
        int n = matrix.size();
        int begin = 0;
        int x,y,temp,length,dx,dy;
        for(int d = n -1; d >= 1; d -= 2)
        {
            x = begin,y = begin;
            temp  = matrix[x][y];
            matrix[x][y] = matrix[x + d][y];
            x = x + d;
            matrix[x][y] = matrix[x][y + d];
            y = y + d;
            matrix[x][y] =  matrix[x - d][y];
            x = x - d;
            matrix[x][y] = temp;
            length = n - 1 - begin * 2;
            for(int dx = length - 1; dx >= 1; dx --)
            {
                
                dy = length - dx;
                x = begin,y = begin + dy;
                temp  = matrix[x][y];
                matrix[x][y] = matrix[x + dx][y - dy];
                x = x + dx, y = y - dy;
                matrix[x][y] = matrix[x + dy][y + dx];
                x = x + dy, y = y + dx;
                matrix[x][y] =  matrix[x - dx][y + dy];
                x = x - dx, y = y + dy;
                matrix[x][y] = temp;
            }
            begin ++;
        }
        
    }
};

根据坐标提示改后的代码

class Solution {
public:
    void rotate(vector<vector<int>>& matrix) {
        int n = matrix.size();
        int x,y,nx,ny;
        for(int i = 0; i < n - 1; i ++)
        {
            for(int j = i; j < n - 1 - i; j ++)
            {
                x =  i,y = j;
                for(int k = 0; k < 3; k ++)
                { 
                    nx = n - 1- y,ny = x;
                    swap(matrix[x][y],matrix[nx][ny]);
                    x = nx,y = ny;
                }
            }
        }
        
    }
};

大佬的代码


void rotate(vector<vector<int> > &matrix) {
    reverse(matrix.begin(), matrix.end());
    for (int i = 0; i < matrix.size(); ++i) {
        for (int j = i + 1; j < matrix[i].size(); ++j)
            swap(matrix[i][j], matrix[j][i]);
    }
}


小结

每道题都有很多种做法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值