【力扣48. 旋转图像】超好记忆版 + 口诀

题目

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

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

正确答案

swap 版

cpp 复制代码
class Solution
{
public:
    void rotate(vector<vector<int>>& matrix)
    {
        int n = matrix.size();
        for (int i = 0; i < n / 2; i += 1)
        {
            for (int j = 0 ; j < (n + 1) / 2; j += 1)
            {
                // 从 matrix[i][j]开始,逆时针处理
                // swap 左边的横坐标 == swap 右边的纵坐标
                // swap 左边的纵坐标 + swap 右边的横坐标 == n - 1
                // swap 的右边在下一个 swap 的左边

                // 左下到左上
                swap(matrix[i][j], matrix[n - 1 - j][i]);
                // 右下到左下
                swap(matrix[n - 1 - j][i], matrix[n - 1 - i][n - 1 - j]);
                // 右上到右下
                swap(matrix[n - 1 - i][n - 1 - j], matrix[j][n - 1 - i]);
                // 左上到右上(不需要执行,便于理解)
                // swap(matrix[j][n - 1 - i], matrix[i][j]);
            }
        }
        return;
    }
};

赋值版

cpp 复制代码
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 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]开始,逆时针处理
swap 左边的横坐标 == swap 右边的纵坐标
swap 左边的纵坐标 + swap 右边的横坐标 == n - 1
swap 的右边在下一个 swap 的左边

赋值版基本也是一致的,把口诀中的 swap 改成 等号 就可以了。

相关推荐
CoderYanger14 小时前
A.每日一题:1140. 石子游戏 II
java·程序人生·算法·leetcode·游戏·职场和发展·深度优先
小雨笙笙14 小时前
机器学习:评估模型与选择
人工智能·算法·机器学习
高亦真14 小时前
今天是学习嵌入式的第35天
linux·学习·算法
mengzhi啊14 小时前
QEventLoop loop配合loop.exec();替代while(1)。电脑cpu占用为0,使用while(1)cpu占用率100%
c++·qt
HugoStudio_SWAN14 小时前
洛谷 P1319 / P1320 压缩技术——同一枚硬币的正反面
c++·学习·程序人生·算法
小小晓.15 小时前
C++单例模式万字详解:6种实现演进+线程安全彻底解决+CRTP终极模板
c++·单例模式
j7~16 小时前
【C++11】C++11 新特性全套详解(列表初始化、右值引用、lambda 表达式、function 与 bind 包装器等)
c++·右值引用·lambda表达式·可变参数模板·移动语义·包装器·c++11发展史
wdfk_prog16 小时前
canopennode-rtt推荐,不只可以做从站,也可以承担主站角色
c语言·开发语言·数据库·学习·算法·深度优先
无小道17 小时前
C/C++——可变参数
c语言·开发语言·c++·可变参数
BioRunYiXue17 小时前
科研干货 | IC50全面解读:概念解析、实验设计与数据分析要点
java·开发语言·javascript·人工智能·算法·数据挖掘·数据分析