技术交流可以加:
本人微信:xcg852390212
本人qq:852390212
学习交流qq群1(已满): 962535112
学习交流qq群2: 780902027
旋转图像
给定一个 n × n
的二维矩阵表示一个图像。
将图像顺时针旋转 90 度。
说明:
你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像。
示例 1:
给定 matrix =
[
[1,2,3],
[4,5,6],
[7,8,9]
],
原地旋转输入矩阵,使其变为:
[
[7,4,1],
[8,5,2],
[9,6,3]
]
示例 2:
给定 matrix =
[
[ 5, 1, 9,11],
[ 2, 4, 8,10],
[13, 3, 6, 7],
[15,14,12,16]
],
原地旋转输入矩阵,使其变为:
[
[15,13, 2, 5],
[14, 3, 4, 1],
[12, 6, 8, 9],
[16, 7,10,11]
]
解答
对矩阵顺时针旋转90度,可以分解为子问题:对矩阵的每一层顺时针旋转。这时候问题就简化了,矩阵的单层顺时针旋转相当于将这一层四边的元素一次进行替换即可。例如,先保存左边的元素,然后上边替换左边,右边替换上边,下边替换右边,之前保存的元素替换下边。
- 时间复杂度:O(n2)
- 空间复杂度:O(1)
C++代码
class Solution {
public:
void rotate_circle(int x1,int y1,int x2,int y2,vector<vector<int>>& vec)
{
vector<int> tmp;
for(int i=x1;i<x2;i++)
{
tmp.push_back(vec[i][y1]);
}
int i = x2 - 1;
int j = y2 - 1;
while(i >= x1 && j >= y1)
{
vec[i--][y1] = vec[x2][j--];
}
i = x1 + 1;
j = y2 - 1;
while(j >= y1 && i <= x2)
{
vec[x2][j--] = vec[i++][y2];
}
i = x1 + 1;
j = y1 + 1;
while(i <= x2)
{
vec[i++][y2] = vec[x1][j++];
}
j = y2;
i = 0;
while(j > y1)
{
vec[x1][j--] = tmp[i++];
}
}
void rotate(vector<vector<int>>& matrix) {
int row = matrix.size();
int col = matrix[0].size();
int a1 = 0,b1 = 0;
int a2 = row - 1,b2 = col - 1;
while(a1 < a2 && b1 < b2)
{
rotate_circle(a1++,b1++,a2--,b2--,matrix);
}
}
};
Python代码
class Solution:
def rotate(self, matrix: List[List[int]]) -> None:
"""
Do not return anything, modify matrix in-place instead.
"""
matrix[:] = list(zip(*matrix[::-1]))