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;
}
相关推荐
嘻嘻哈哈樱桃8 小时前
牛客经典101题题解集--动态规划
java·数据结构·python·算法·职场和发展·动态规划
脱氧核糖核酸__8 小时前
LeetCode热题100——234.回文链表(两种解法)
c++·算法·leetcode·链表
IronMurphy8 小时前
【算法四十二】118. 杨辉三角 198. 打家劫舍
算法
电科一班林耿超8 小时前
第 16 课:动态规划专题(二)—— 子序列与子数组问题:面试最高频的 DP 题型
数据结构·算法·动态规划
生信研究猿9 小时前
leetcode 416. 分割等和子集
算法·leetcode·职场和发展
hnjzsyjyj9 小时前
洛谷 B3622:枚举子集(递归实现指数型枚举)← DFS
数据结构·dfs
狗哥哥9 小时前
面包屑自动推导的算法设计:从“最短路径匹配”到工程可落地
算法·架构
隔壁大炮10 小时前
Day07-RNN介绍
人工智能·pytorch·rnn·深度学习·神经网络·算法·numpy
WL_Aurora10 小时前
Python 算法基础篇之什么是算法
python·算法