leetcode-48. 旋转图像

题目

在这里插入图片描述

方法一

其实在做这题的时候画图已经把这种方法给画出来了,但是没深入想,没有找到具体的规律!整体矩阵的顺时针旋转可以分解为:
(1)每个外圈的旋转
(2)每个圈都分为左上,左下,右上,右下
(3)左上 = 左下; 左下 = 右下; 右下 = 右上; 右上 = 左上

class Solution {
public:
    void rotate(vector<vector<int>>& matrix) {
        int up_limit = 0;
        int down_limit = matrix.size()-1;
        // 因为矩阵是n×n的,所以up_limit可以代表左界和上界,down_limit可以代表右界和下界
        /*
            左上:(up_limit,0)
            左下:(2,up_limit)
            右上:(0,down_limit)
            右下:(down_limit,2)
        */
        while(up_limit<=down_limit){
            int p1 = up_limit;
            int p2 = down_limit;
            while(p1!=down_limit){
                int tmp = matrix[up_limit][p1];
                matrix[up_limit][p1] = matrix[p2][up_limit];
                matrix[p2][up_limit] = matrix[down_limit][p2];
                matrix[down_limit][p2] = matrix[p1][down_limit];
                matrix[p1][down_limit] = tmp;
                p1++;
                p2--;
            }
            up_limit++;
            down_limit--;
        }
        
    }
};

方法二

最简单直白的做法,先对矩阵上下翻转,再依据对角线交换:

class Solution {
public:
    void rotate(vector<vector<int>>& matrix) {
        reverse(matrix.begin(),matrix.end());
        for(int i = 0;i<matrix.size();i++){
            for(int j=0;j<=i;j++){
                int tmp = matrix[i][j];
                matrix[i][j] = matrix[j][i];
                matrix[j][i] = tmp;
            }
        }
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值