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;
}
相关推荐
仰泳的熊猫2 小时前
题目 2304: 蓝桥杯2019年第十届省赛真题-特别数的和
数据结构·c++·算法·蓝桥杯
靠沿2 小时前
【优选算法】专题十五——BFS解决FloodFill算法
算法·宽度优先
2401_849644852 小时前
C++代码重构实战
开发语言·c++·算法
fengfuyao9852 小时前
一个改进的MATLAB CVA(Change Vector Analysis)变化检测程序
前端·算法·matlab
2301_815482932 小时前
C++与WebAssembly集成
开发语言·c++·算法
像污秽一样2 小时前
算法设计与分析-习题4.3
数据结构·算法·排序算法
ComputerInBook2 小时前
几何学基本概念——超平面(hyperplane)
算法·机器学习·平面·几何学
沈阳信息学奥赛培训2 小时前
C++ 指针* 和 指针的引用 *& (不是指针和引用,是指针的引用)
数据结构·c++·算法
老鱼说AI2 小时前
《深入理解计算机系统》(CSAPP)2.2:整数数据类型与底层机器级表示
开发语言·汇编·算法·c#