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)\)。

相关推荐
曹牧2 分钟前
VS: Visual Studio 里把未包含的文件加进项目2
linux·运维·算法
考研保研资料分享14 分钟前
2022投资学跨保中国农业大学公共管理:四校面试与海投复盘
面试·职场和发展
重生之小比特20 分钟前
【算法拾光】滑动窗口|长度最小的子数组 + 无重复字符的最长子串
算法
weixin_3077791326 分钟前
C++代码实现MATLAB中的fitnlm函数功能
开发语言·c++·算法·matlab
雪落漂泊30 分钟前
C++算法:双指针篇(下)
数据结构·c++·算法
生态学者10 小时前
Global Change Biology | 森林越“步调一致”,反而越怕干旱?树木生长与叶片活动的同步之谜
大数据·人工智能·算法·r语言·微信公众平台
lsswear10 小时前
Agent 框架新手入门与实战部署指南
大数据·人工智能·算法
考研保研资料分享11 小时前
2022编辑出版跨保西北大学中国史:五校面试与九月补材料
面试·职场和发展
Data analyse45612 小时前
rnweb 回放数据量太大怎么办?分片存储与断点续传的实现思路
前端·网络·算法·数据分析
员工风险管理实务12 小时前
职务侵占有什么价值?岗位关联性与必要性判断
职场和发展