LeetCode 48. 旋转图像

LeetCode 48. 旋转图像

问题描述

给定一个 n × n 的二维矩阵表示图像,要求将图像顺时针旋转 90 度 。旋转必须在原地完成,即直接修改输入矩阵,不使用额外空间。

示例:

plaintext 复制代码
输入:matrix = [[1,2,3],
               [4,5,6],
               [7,8,9]]
输出:[[7,4,1],
      [8,5,2],
      [9,6,3]]

解决思路:转置 + 镜像翻转

通过两个步骤实现原地旋转:

  1. 矩阵转置 :沿主对角线翻转元素
    matrix[i][j]matrix[j][i]
  2. 水平镜像翻转 :每行左右翻转元素
    matrix[i][j]matrix[i][n-1-j]

数学证明

  • 顺时针旋转公式:matrix[i][j] → matrix[j][n-1-i]
  • 转置后:matrix[i][j] → matrix[j][i]
  • 镜像翻转后:matrix[j][i] → matrix[j][n-1-i]

C++ 代码实现
cpp 复制代码
class Solution {
public:
    void rotate(vector<vector<int>>& matrix) {
        int n = matrix.size();
        
        // 1. 矩阵转置 (沿主对角线翻转)
        for (int i = 0; i < n; ++i) {
            for (int j = i + 1; j < n; ++j) {
                swap(matrix[i][j], matrix[j][i]);
            }
        }
        
        // 2. 水平镜像翻转 (每行左右翻转)
        for (int i = 0; i < n; ++i) {
            int left = 0, right = n - 1;
            while (left < right) {
                swap(matrix[i][left], matrix[i][right]);
                ++left;
                --right;
            }
        }
    }
};

关键点解析
  1. 转置操作

    • 遍历上三角区域(避免重复交换)
    • i0n-1ji+1n-1
    • 交换 matrix[i][j]matrix[j][i]
  2. 镜像翻转

    • 对每行用双指针法(leftright
    • 交换行首尾元素并向中间移动
  3. 时间复杂度:O(n²)

    • 转置:O(n²/2) ≈ O(n²)
    • 镜像:O(n²/2) ≈ O(n²)
  4. 空间复杂度 :O(1)

    完全原地操作


示例推演

3×3 矩阵为例:

plaintext 复制代码
初始矩阵:
1 2 3
4 5 6
7 8 9

步骤1:转置(沿主对角线翻转):
1 4 7
2 5 8
3 6 9

步骤2:水平镜像(每行左右翻转):
7 4 1  ← 翻转 [1,4,7] → [7,4,1]
8 5 2  ← 翻转 [2,5,8] → [8,5,2]
9 6 3  ← 翻转 [3,6,9] → [9,6,3]

最终得到顺时针旋转 90 度的结果:

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

此方法简洁高效,严格满足原地操作要求,是旋转矩阵的最优解法。

相关推荐
2351628 分钟前
【MySQL】慢查寻的发现和解决优化(思维导图版)
java·后端·sql·mysql·职场和发展·数据库开发·数据库架构
IT古董1 小时前
【第五章:计算机视觉-项目实战之推荐/广告系统】2.粗排算法-(3)理解粗排模型之在线部分:在线架构及对双塔的应用
算法·1024程序员节
大数据张老师1 小时前
数据结构——平衡二叉树
数据结构·算法·查找
py有趣1 小时前
LeetCode算法学习之合并区间
学习·算法·leetcode
m0_748233642 小时前
单调栈详解【C/C++】
c语言·c++·算法·1024程序员节
郝学胜-神的一滴2 小时前
Linux中的`fork`函数详解:深入解析
linux·服务器·开发语言·c++·算法
大数据张老师3 小时前
数据结构——BF算法
数据结构·算法·1024程序员节
让我们一起加油好吗3 小时前
【数论】欧拉定理 && 扩展欧拉定理
c++·算法·数论·1024程序员节·欧拉定理·欧拉降幂·扩展欧拉定理
一匹电信狗3 小时前
【LeetCode_876_2.02】快慢指针在链表中的简单应用
c语言·数据结构·c++·算法·leetcode·链表·stl
胖咕噜的稞达鸭3 小时前
算法入门---专题二:滑动窗口2(最大连续1的个数,无重复字符的最长子串 )
c语言·数据结构·c++·算法·推荐算法·1024程序员节