LeetCode48--Rotate Image

本文介绍了一种不使用额外数组空间,通过找寻规律实现二维数组90度旋转的算法。通过分析元素旋转后的规律,利用逆向交换的方式,逐层处理数组的外圈,实现了数组的高效旋转。

这一题实际上可以找规律完成,它让我们把整个数组旋转90度。
我们可以从外圈开始转,一圈一圈搞定它。
一个元素旋转后的位置,取决于本身的位置与当前这个圈的边长。
我们简单找几个元素算一下就可以发现规律了(注意:找规律的题一定要保留中间的计算过程,不要急着化简!做数学题和计算机题都是这样
我简单测试了几个数据,已经放在注释里了,感兴趣的可以自己推一推这个过程。

如果要问我怎么想到是找规律的?题目不让你额外开数组,那肯定是有什么办法巧妙实现的,我初始是发现,若把整个圈展开,其实交换的点他们的距离是一样的,且在同一个圈里,每次交换的距离保持一致,那这肯定是有规律的了;然后把点放回正方形里,简单算一下就行了。
好啦,Show Code

#include<algorithm>
class Solution {
public:
    void rotate(vector<vector<int>>& matrix) {
        //把要翻转的矩阵外圈展开,得到一条直线。设此时这个外圈边长为x(下标从零开始)那么:
        //然后分别处理第一条边上的每一个点。
        //位于第一排的被转到第二列;位于第二列的被转到了第二排,位于第二排的被转到了第一列,位于第一列的被转到了第一排
        //如(0,1)元素 
        //(0,1)-->(1,n-1)-->(n-1,n-2)-->(n-2,0)-->(0,1)  
        //如(0,3)元素
        //(0,3)-->(3,n-1)-->(n-1,n-4)-->(n-4,0)-->(0,3)
        //如(1,k)元素
        //(1,k)-->(k,n-1-1)-->(n-1-1,n-1-k)-->(n-1-k,1)-->(1,k)
        //按照上面的顺序,先遍历完外圈,然后范围往中间缩1,起始位置行列各加1,当下标达到了一半则停止计算
        int temp,item;
        int n = matrix[0].size();
        int i0 = 0,j0 = 0,n0 =  n;
        while(i0 < matrix[0].size()/2)//小于一半则继续
        {
            if(i0 >= n0)//当错位时,结束吧
                break;
            //限定第一排的起始位置
            for(int j = j0;j < n0-1;++j)
            {
                //拿到第一排的元素(x0,j)了,先把第二列的对应元素取出来,再把它放到那个位置
                // item = matrix[x0][j];
                // temp = matrix[j][n-j];
                // matrix[j][n-j] = item;//顺时针一个个换也可以,但是写起来不好看,直接逆向交换
                swap(matrix[i0][j],matrix[n-1-j][i0]);//处理好对应的下标即可
                swap(matrix[n-1-j][i0],matrix[n-1-i0][n-1-j]);
                swap(matrix[n-1-i0][n-1-j],matrix[j][n-1-i0]);
            }
            i0+=1;
            j0+=1;
            n0-=1;
        }
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值