leetcode 48旋转图像

cpp 复制代码
class Solution {
public:
    void rotate(vector<vector<int>>& matrix) {
        int n = matrix.size();
        for(int i = 0;i<n;i++){
            for(int j=i;j<n;j++){
                swap(matrix[i][j],matrix[j][i]);
            }
        }
        for(int i=0;i<n;i++){
            reverse(matrix[i].begin(),matrix[i].end());
        }
    }
};

这段代码的作用就是:把一个 \(n \times n\) 的矩阵顺时针旋转 90°。核心只有两步。

原矩阵假设是:

复制代码
1 2 3
4 5 6
7 8 9

第一步,沿主对角线转置

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

swap(matrix[i][j], matrix[j][i]) 就是把行列位置交换,例如:

复制代码
2 ↔ 4
3 ↔ 7
6 ↔ 8

于是:

复制代码
1 2 3       1 4 7
4 5 6  →    2 5 8
7 8 9       3 6 9

这里 j = i 是为了只交换主对角线右上方的元素,防止同一对元素交换两次又换回来。

第二步,把每一行左右反转

复制代码
for(int i = 0; i < n; i++){
    reverse(matrix[i].begin(), matrix[i].end());
}

也就是:

复制代码
1 4 7       7 4 1
2 5 8  →    8 5 2
3 6 9       9 6 3

最终:

复制代码
7 4 1
8 5 2
9 6 3

这就是原矩阵顺时针旋转 90°

所以这道题最简单的记忆方式就是:

顺时针旋转 90° = 先转置 + 再每行反转

时间复杂度是 \(O(n^2)\) ,额外空间复杂度是 \(O(1)\)

相关推荐
嘟嘟07172 小时前
顺时针螺旋填充 n×n 矩阵:手撕 generateMatrix 的四个 for 循环
javascript·算法·面试
Nil2082 小时前
leetcode 206反转链表
算法·leetcode·链表
Kstheme2 小时前
大模型内部是怎么运作的?从「一个神经元」拆到「残差流」
算法
郝学胜_神的一滴2 小时前
并查集深度入门:从玄学抽象到 QuickFind & QuickUnion 源码实战
数据结构·算法
GeekZHR2 小时前
C语言指针2:数组名、二级指针、指针数组,一次把“指针和数组“讲透
c语言·数据结构·算法·指针
h_a_o777oah2 小时前
【算法基础】卡特兰数:递推定义与折线对称公式推导及解题策略
c++·算法·acm·组合数学·卡特兰数·反射原理·动态规划dp
JAI科研2 小时前
Deepseek Agent Harness教程(二) | DeepSeek Harness 设计思路
人工智能·深度学习·算法·机器学习·自然语言处理·transformer·vllm
还不秃顶的计科生2 小时前
具身智能论文学习10:π0: A Vision-Language-Action Flow Model for General Robot Control
人工智能·深度学习·算法·机器学习·语言模型·vla·vlm
Dr.kangder2 小时前
嵌入式面试总结(二十一)——C语言关键字
c语言·开发语言·面试·职场和发展·架构·虚拟化