#19269. 图像的原地旋转(LeetCode48)
图像的原地旋转(LeetCode48)
https://leetcode.cn/problems/rotate-image
LeetCode 48 "Rotate Image" 是一道非常经典的二维数组操作题目。原题强调“原地(In-place)”旋转,这在面试中是为了考察空间复杂度优化。
在 OI 竞赛中,通常我们关注输入输出的正确性,但为了保留这道题的精髓(同时也是为了训练大家对二维坐标变换的敏感度),我将其改写为标准的 OI 题目格式,并提供原地旋转的解法代码。
OI 习题:图像旋转 (Rotate Image)
【题目描述】
给定一个 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。
你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵。虽然在竞赛中我们只检查最终输出,但建议尝试不使用另一个 的辅助矩阵来解决这个问题,以锻炼对数组下标的控制能力。
旋转规则示例:
- 原位置 的元素,旋转 90 度后应该出现在位置 。
【输入格式】
第一行包含一个整数 ,表示矩阵的大小。 接下来 行,每行包含 个整数,表示矩阵中的元素。
【输出格式】
输出 行,每行 个整数,表示旋转后的矩阵。 数字之间用空格分隔。
【样例输入 1】
3
1 2 3
4 5 6
7 8 9
【样例输出 1】
7 4 1
8 5 2
9 6 3
【样例输入 2】
4
5 1 9 11
2 4 8 10
13 3 6 7
15 14 12 16
【样例输出 2】
15 13 2 5
14 3 4 1
12 6 8 9
16 7 10 11
【数据范围】
【解题思路提示】
要在原地将矩阵顺时针旋转 90 度,有一个非常经典的数学技巧,分为两步:
- 转置 (Transpose):将矩阵沿主对角线翻转。
- 即:
swap(matrix[i][j], matrix[j][i]) - 效果:行变成了列。
- 即:
- 翻转行 (Reverse Rows):将每一行内部进行左右翻转。
- 即:
reverse(matrix[i].begin(), matrix[i].end())
- 即:
为什么这样有效?
- 原始:第一行是
1 2 3。 - 转置后:第一列变成
1 2 3。 - 翻转行后:第一列的
1跑到了最后一列的开头。这正是顺时针旋转的效果(原左上角的元素,跑到了右上角)。
【参考代码 (C++14 OI Style)】
见题解