《LeetCode之每日一题》:126.旋转图像

Posted 是七喜呀!

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《LeetCode之每日一题》:126.旋转图像相关的知识,希望对你有一定的参考价值。

旋转图像


题目链接: 旋转图像

有关题目

给定一个 n × n 的二维矩阵 matrix 表示一个图像。
请你将图像顺时针旋转 90 度。

你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。
请不要 使用另一个矩阵来旋转图像。
示例 3:

输入:matrix = [[1]]
输出:[[1]]
示例 4:

输入:matrix = [[1,2],[3,4]]
输出:[[3,1],[4,2]]
提示:
matrix.length == n
matrix[i].length == n
1 <= n <= 20
-1000 <= matrix[i][j] <= 1000

题解

参考官方题解
法一:使用辅助数组

思路:
原矩阵中的第 i 行 的第 j 个元素,旋转90° 后
变为倒数第 i 列的 第 j 个元素
class Solution {
public:
    void rotate(vector<vector<int>>& matrix) {
        int m = matrix.size();
        auto matrix_new = matrix;
        for (int i = 0; i < m; ++i){
            for (int j = 0; j < m; ++j){
                matrix_new[j][m - 1 - i] = matrix[i][j];
            }
        }
        matrix = matrix_new;
    }
};

时间复杂度:O(N ^ 2)
空间复杂度:O(N ^ 2)

法二:原地旋转

思路:
在解法一的基础上,我们通过四次旋转,发现可以回到原始位置

class Solution {
public:
    void rotate(vector<vector<int>>& matrix) {
        //matrix_new[j][n - 1 - i] = matrix[i][j];
        //row = col(j), col = n - 1 - row(n - 1 - i);
        int n = matrix.size();
        for (int i = 0; i < n / 2; ++i){
            for (int j = 0; j < (n + 1) / 2; ++j){
                int temp = 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] = temp;
            }
        }
    }
};


法三:用翻转代替旋转

水平轴翻转:matrix[i][j] = matrix[n - 1 - i][j]
对角线翻转:matrix[n - 1 - i][j] = matrix[j][n - 1 - 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; ++j){
                int temp = matrix[i][j];
                matrix[i][j] = matrix[n - 1 - i][j];
                matrix[n - 1 - i][j] = temp;
            }
        }

        //对角线翻转
        for (int i = 0; i < n; ++i){
            for (int j = 0; j < i; j++){
                swap(matrix[i][j], matrix[j][i]);
            }
        }
    }
    
};

以上是关于《LeetCode之每日一题》:126.旋转图像的主要内容,如果未能解决你的问题,请参考以下文章

leetcode 每日一题 48. 旋转图像

《LeetCode之每日一题》:60.搜索旋转排序数组

《LeetCode之每日一题》:268.寻找旋转数组中的最小值

《LeetCode之每日一题》:17. 旋转数组

《LeetCode之每日一题》:71.翻转图像

《LeetCode之每日一题》:280.矩阵置零