zoukankan      html  css  js  c++  java
  • [LeetCode]27. 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?

    解法1:新开辟一个矩阵,空间复杂度O(n^2)。

    class Solution {
    public:
        void rotate(vector<vector<int>>& matrix) {
            if(matrix.empty() || matrix[0].empty())
                return;
            int n = matrix.size();      
            vector< vector<int> > tmp(n, vector<int>(n, 0));
            for (int i = 0; i < n; i++)
            {
                for (int j = 0; j < n; j++)
                    tmp[j][n - 1 - i] = matrix[i][j];
            }
            for(int i = 0; i < n; i++)
                copy(tmp[i].begin(), tmp[i].end(), matrix[i].begin());
        }
    };

    解法2:矩阵顺时针旋转90°可以通过两个操作来完成:先将矩阵上下翻转,然后将矩阵转置(按左上-右下对角线翻转)。空间复杂度O(1)。

    class Solution {
    public:
        void rotate(vector<vector<int>>& matrix) {
            if(matrix.empty() || matrix[0].empty())
                return;
            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 - 1 - i][j]);
            }
            for (int i = 0; i < n; i++)
            {
                for (int j = 0; j < i; j++)
                    swap(matrix[i][j], matrix[j][i]);
            }
        }
    };

    或者先转置,再左右翻转。reverse能放在第一层for循环内是因为前面进行的转置已经处理好一行了。

    class Solution {
    public:
        void rotate(vector<vector<int> > &matrix) {
            if(matrix.empty() || matrix[0].empty())
                return;
            int n = matrix.size();
            for (int i = 0; i < n; ++i) {
                for (int j = i + 1; j < n; ++j) {
                    swap(matrix[i][j], matrix[j][i]);
                }
                reverse(matrix[i].begin(), matrix[i].end());
            }
        }
    };

    或者先按右上-左下对角线翻转,再上下翻转。注意按照右上-左下对角线翻转时对应坐标关系。

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

    或者先左右翻转,再按照右上-左下对角线翻转。

    class Solution {
    public:
        void rotate(vector<vector<int>>& matrix) {
            if(matrix.empty() || matrix[0].empty())
                return;
            int n = matrix.size();
            for(int i = 0; i < n; i++)
                reverse(matrix[i].begin(), matrix[i].end());
            for (int i = 0; i < n; i++)
            {
                for (int j = 0; j < n - 1 - i; j++)
                    swap(matrix[i][j], matrix[n - 1 - j][n - 1 - i]);
            }
        }
    };

    解法3:3*3的矩阵可以看做两圈,中间一圈只有一个数字不需要动,只需将外面一圈顺时针旋转90°即可;4*4矩阵两圈,分别顺时针旋转90°即可。因此可以每次旋转一圈,一共需要旋转n/2圈,每圈旋转n-1个数字。

    class Solution {
    public:
        void rotate(vector<vector<int>>& matrix) {
            if(matrix.empty() || matrix[0].empty())
                return;
            int n = matrix.size();
            for (int i = 0; i < n / 2; i++) //处理矩阵的哪一圈 
            {
                for (int j = i; j < n - 1 - i; j++) //每圈需要处理的元素个数
                {
                    int tmp = matrix[i][j];
                    matrix[i][j] = matrix[n - 1 - j][i];
                    matrix[n - 1 - j][i] = matrix[n - 1 - i][n - 1 - j];
                    matrix[n - 1 - i][n - 1 - j] = matrix[j][n - 1 - i];
                    matrix[j][n - 1 - i] = tmp;
                }
            }
        }
    };
  • 相关阅读:
    CVE-2021-25646 Apache Druid远程命令执行漏洞复现
    CVE-2021-3156漏洞复现
    助力抗疫 Splashtop 远程控制软件限时免费
    Splashtop Business Access 的常见问题解答
    热烈祝贺 Splashtop 荣获“最佳远程办公解决方案”奖
    Mark Lee:Splashtop 如何成为最新的 10 亿美元估值技术独角兽
    Splashtop获5000万美元新投资 成为远程桌面行业独角兽
    热烈祝贺 Splashtop 赢得最佳远程桌面用户满意度得分
    [翻译系列]正则表达式简介
    tensorflow2.0 keras 迁移学习 删除预训练模型的最后一层(layer)
  • 原文地址:https://www.cnblogs.com/aprilcheny/p/4883010.html
Copyright © 2011-2022 走看看