这一问题可以有如下问法(都是空间复杂度为常数级别):
- 矩阵左旋/右旋90度
- 矩阵左旋/右旋180度
对于本题,有两种思路:
思路一:利用对称进行旋转——先根据主对角线互换元素,再根据垂直中线互换元素
思路二:利用坐标映射
强烈建议用第一种方法,因为找第二种方法的坐标关系特别特别特别麻烦
举一反三:面对旋转、填充一类的题型,一定要考虑对称这一“大杀器”,它能极大的减少工作量,提高解题正确率和解题效率
思路一的代码
//
// Created by jt on 2020/9/5.
//
#include <vector>
#include <algorithm>
using namespace std;
class Solution {
public:
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) {
swap(matrix[i][j], matrix[j][i]);
}
}
// 左右反转
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n / 2; ++j) {
swap(matrix[i][j], matrix[i][n-1-j]);
}
}
}
};思路二的代码
//
// Created by jt on 2020/9/5.
//
#include <vector>
#include <algorithm>
using namespace std;
class Solution {
public:
void rotate(vector<vector<int> > &matrix) {
int n = matrix.size();
for (int i = 0; i < n / 2; ++i) {
int m = n - 2 * i;
for (int j = i; j < i + m - 1; ++j) {
int tmp = matrix[i][j];
matrix[i][j] = matrix[2*i-j+m-1][i];
matrix[2*i-j+m-1][i] = matrix[i+m-1][2*i-j+m-1];
matrix[i+m-1][2*i-j+m-1] = matrix[j][i+m-1];
matrix[j][i+m-1] = tmp;
}
}
}
};
京公网安备 11010502036488号