LC 旋转矩阵
题目描述:
给你一幅由 N × N 矩阵表示的图像,其中每个像素的大小为 4 字节。请你设计一种算法,将图像旋转 90 度。 不占用额外内存空间能否做到?
题目示例如下:
示例一:
给定 matrix =
[[1,2,3],[4,5,6],[7,8,9]
],原地旋转输入矩阵,使其变为:
[[7,4,1],[8,5,2],[9,6,3]
]示例二:
给定 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]
]
审题:
本题要求空间复杂度为零,因此不能申请额外的空间。
题目是旋转矩阵,我们可以拆解为两步:
第一步将矩阵a[i][j]与a[j][i]互换
matrix =
[[1,2,3],[4,5,6],[7,8,9]
]===》
matrix =
[[1,4,7],[2,5,8],[3,6,9]
]
第二步将矩阵的每一行首位互换位置:
matrix =
[[1,4,7],[2,5,8],[3,6,9]
]===》
matrix =
[[7,4,1],[8,5,2],[9,6,3]
]
代码如下:
void rotate(vector<vector<int>>& matrix) {int n = matrix.size();// 转置矩阵for (int i = 0; i < n; ++i) {for (int j = i + 1; j < n; ++j) {std::swap(matrix[i][j], matrix[j][i]);}}// 逆序每一行for (int i = 0; i < n; ++i) {reverse(matrix[i].begin(), matrix[i].end());}
}