Rotate Image数组--力扣101算法题解笔记

11.2Rotate Image数组

题目描述

给定一个n * n 的矩阵,求它顺时针旋转90度的结果,且必须在原矩阵上修改,怎么样才能够尽量不创建额外存储空间?

输入输出样例

Input :

{{1,2,3},

{4,5,6},

{7,8,9}}

Output:

\[7,4,1\], \[8,5,2\], \[9,6,3\]

题解

核心逻辑:一圈一圈旋转 + 四个点一组交换

矩阵旋转,本质是每 4 个位置的数字循环换位

旋转规则(顺时针 90 度)

四个点的位置关系:顶部 → 右侧 → 底部 → 左侧 → 顶部

坐标怎么算?

n = 矩阵边长

  • 上:matrix[i][j]

  • 右:matrix[j][n-1-i]

  • 下:matrix[n-1-i][n-1-j]

  • 左:matrix[n-1-j][i]

交换过程(拿数字 1 举例)

  1. 先把顶部 1存起来

  2. 左边 7 移到上面

  3. 底部 9 移到左边

  4. 右边 3 移到底部

  5. 存好的 1 移到右边

cpp 复制代码
#include <iostream>
#include <vector>
using namespace std;

void rotate(vector<vector<int>>& matrix) {
    int n = matrix.size(); // 矩阵边长
    for (int i = 0; i < n / 2; ++i) {
        for (int j = i; j < n - i - 1; ++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;
        }
    }
}

void printMatrix(vector<vector<int>>& matrix) {
    for (auto& row : matrix) {
        for (int num : row) {
            cout << num << " ";
        }
        cout << endl;
    }
}

int main() {
    vector<vector<int>> matrix = { {1,2,3},{4,5,6},{7,8,9} };

    cout << "旋转前:" << endl;
    printMatrix(matrix);

    rotate(matrix);

    cout << "\n旋转后(顺时针90度):" << endl;
    printMatrix(matrix);

    return 0;
}
相关推荐
汀、人工智能4 小时前
[特殊字符] 第40课:二叉树最大深度
数据结构·算法·数据库架构·图论·bfs·二叉树最大深度
沉鱼.444 小时前
第十二届题目
java·前端·算法
赫瑞4 小时前
数据结构中的排列组合 —— Java实现
java·开发语言·数据结构
大熊背4 小时前
ISP Pipeline中Lv实现方式探究之三--lv计算定点实现
数据结构·算法·自动曝光·lv·isppipeline
西岸行者5 小时前
BF信号是如何多路合一的
算法
大熊背6 小时前
ISP Pipeline中Lv实现方式探究之一
算法·自动白平衡·自动曝光
罗西的思考6 小时前
【OpenClaw】通过 Nanobot 源码学习架构---(5)Context
人工智能·算法·机器学习
Liudef067 小时前
后量子密码学(PQC)深度解析:算法原理、标准进展与软件开发行业的影响
算法·密码学·量子计算
OYpBNTQXi8 小时前
SEAL全同态加密CKKS方案入门详解
算法·机器学习·同态加密
yuannl109 小时前
数据结构----队列的实现
数据结构