48 . 旋转图像
描述:
分析:
顺时针旋转可以理解为,首先沿着副对角线翻转一次,然后沿着水平中线翻转一次
或者,首先沿着主对角线翻转一次,再沿着水平中线翻转一次
解法1:
class Solution {
public:
void rotate(vector<vector<int>>& matrix) {
reverse(matrix.begin(), matrix.end());//沿水平中线反转
for (int i = 0; i < matrix.size(); ++i) { //沿副对角线反转
for (int j = i + 1; j < matrix[i].size(); ++j)
swap(matrix[i][j], matrix[j][i]);
}
}
};
解法2:
class Solution {
public:
void rotate(vector<vector<int>>& matrix) {
const int n = matrix.size();
for (int i = 0; i < n; ++i) // 沿副对角线反转
for (int j = 0; j < n - i; ++j)
swap(matrix[i][j], matrix[n - 1 - j][n - 1 - i]);
for (int i = 0; i < n / 2; ++i) // 沿水平中线反转
for (int j = 0; j < n; ++j)
swap(matrix[i][j], matrix[n - 1 - i][j]);
}
};
解法3:
class Solution {
public:
void rotate(vector<vector<int>>& matrix) {
const int n = matrix.size();
for (int i = 0; i < n / 2; ++i) // 沿水平中线反转
for (int j = 0; j < n; ++j)
swap(matrix[i][j], matrix[n - 1 - i][j]);
for (int i = 0; i < n; ++i) // 沿主对角线反转
for (int j = i + 1; j < n; ++j)
swap(matrix[i][j], matrix[j][i]);
}
};