LeetCode第十九天

目录

一、旋转图像

 翻转

原地旋转

二、判断矩阵经轮转后是否一致

 原地旋转比较

坐标转换比较


一、旋转图像

 翻转

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

        for(int i = 0; i < n; i++){
            for(int j = 0; j < i; j++){
                swap(matrix[i][j], matrix[j][i]);
            }
        }
    }
};

原地旋转

        通过观察矩阵,可以看出只要一次性旋转四个数便可以完成原地旋转,其过程可以确保不遗漏且不重复。

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

二、判断矩阵经轮转后是否一致

 原地旋转比较

        转动三次依次比较

class Solution {
public:
    bool findRotation(vector<vector<int>>& mat, vector<vector<int>>& target) {
        int n = mat.size();
        if(mat == target)
            return true;
        for(int i = 0; i < 3; i++){
            for(int i = 0; i < n / 2; i++){
                for(int j = 0; j < (n + 1) / 2; j++){
                    int tmp = mat[i][j];
                    mat[i][j] = mat[n - j - 1][i];
                    mat[n - j - 1][i] = mat[n - i - 1][n - j - 1];
                    mat[n - i - 1][n - j - 1] = mat[j][n - i - 1];
                    mat[j][n - i - 1] = tmp;
                }
            }

            if(mat == target)
                return true;
        }
        return false;
    }
};

坐标转换比较

转度数       原坐标         转换坐标
90°            [x, y]   ->    [y, n - x - 1]
180°           [x, y]   ->    [n - x - 1, n - y - 1]
270°           [x, y]   ->    [n - y - 1, x]
class Solution {
public:
    bool findRotation(vector<vector<int>>& mat, vector<vector<int>>& target) {
        int n = mat.size();
        if(mat == target)
            return true;
        int flag = 1;
        for(int i = 0; i < n; i++){
            for(int j = 0; j < n; j++){
               if(mat[i][j] != target[j][n - i - 1]){
                   flag = 0;
                   break;
               } 
            }
        }
        if(flag == 1)
            return true;
        else{
            flag = 1;
        }
        for(int i = 0; i < n; i++){
            for(int j = 0; j < n; j++){
               if(mat[i][j] != target[n - i - 1][n - j - 1]){
                   flag = 0;
                   break;
               } 
            }
        }
        if(flag == 1)
            return true;
        else{
            flag = 1;
        }
        for(int i = 0; i < n; i++){
            for(int j = 0; j < n; j++){
               if(mat[i][j] != target[n - j - 1][i]){
                   flag = 0;
                   break;
               } 
            }
        }
        if(flag == 1)
            return true;
        else{
            flag = 1;
        }
        return false;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值