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;
}
相关推荐
choumou_M2 小时前
算法_1:由浅入深学习快速排序QuickSort
学习·算法·排序算法
Coder_Shenshen2 小时前
罗克韦尔ACD工程归档离线变量树解析
算法·c#
心仪久了会沦陷4 小时前
C语言数据结构入门——树与二叉树详解:概念、堆实现与链式遍历
c语言·数据结构·算法
小此方4 小时前
[算法实战论:动态规划]背包问题概念,01不满背包问题,01满背包问题,背包问题的滚动数组空间优化
算法·动态规划
悠仁さん5 小时前
【C++】哈希表
c++·算法·散列表
码少女5 小时前
数据结构——图的基础
数据结构
地平线开发者6 小时前
点云算法整理与常用计算模块:从数据到模型,再到工程与量化
算法·自动驾驶
Severus_black7 小时前
【C++初阶】list使用及相关实现,思路顺滑流畅!
c语言·数据结构·c++·stl·list
武子康8 小时前
H3-World 为何在加载 LoRA 前,先检查导入的代码?
人工智能·深度学习·算法
秋天的怀念_David9 小时前
算法一千零一夜 · 第二十八夜 注册
java·程序人生·算法