LeetCode热题100——48.旋转图像(题解+答案+要点)

题目:

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

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

示例 1:

输入: matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[[7,4,1],[8,5,2],[9,6,3]]

示例 2:

输入: matrix = [[5,1,9,11],[2,4,8,10],[13,3,6,7],[15,14,12,16]]
输出:[[15,13,2,5],[14,3,4,1],[12,6,8,9],[16,7,10,11]]

题解:

算法思路:

顺时针旋转 90 度可以通过两个简单的变换组合完成:

  • 上下翻转:将矩阵的第 行与第 行交换。
  • 转置:沿主对角线对称交换元素,即 交换。

为什么这样做有效?

顺时针旋转 90° 的数学映射为:

  • 上下翻转的映射为:
  • 转置的映射为:

先上下翻转再转置:

正好得到顺时针旋转 90° 的结果。

答案:

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;j++){
                swap(matrix[i][j],matrix[n-i-1][j]);
            }
        }
        //转置
        for(int i=0;i<n;i++){
            for(int j=0;j<i;j++){
                swap(matrix[i][j],matrix[j][i]);
            }
        }
    }
};

要点:

  • 上下翻转:只需遍历前 n/2 行(i < n/2),因为每一对行只需交换一次。若 n 为奇数,中间行不动。
  • 转置:内层循环j < i保证了只交换矩阵的下三角(或上三角)元素,避免重复交换。如果写成 j < n,每个元素会被交换两次,等于没做转置。
相关推荐
IT大白鼠9 小时前
AIGC性能的关键瓶颈:算力、数据、算法三者如何互相制约?
算法·aigc
tjl521314_219 小时前
04C++ 名称空间(Namespace)
开发语言·c++
ximu_polaris9 小时前
设计模式(C++)-行为型模式-备忘录模式
c++·设计模式·备忘录模式
白雪茫茫10 小时前
监督学习、半监督学习、无监督学习算法详解
python·学习·算法·ai
FengyunSky10 小时前
浅析 空间频率响应 SFR 计算
算法
树下水月10 小时前
PHP 一种改良版的雪花算法
算法·php·dreamweaver
一只数据集11 小时前
全尺寸人形机器人灵巧手力觉触觉数据集-2908条ROSbag数据覆盖14大应用场景深度解析
大数据·人工智能·算法·机器人
罗西的思考12 小时前
【GUI-Agent】阿里通义MAI-UI 代码阅读(2)--- 实现
人工智能·算法·机器学习
刀法如飞13 小时前
TypeScript 数组去重的 20 种实现方式,哪一种你还不知道?
前端·javascript·算法
tankeven14 小时前
C++ 智能指针
c++