这一问题可以有如下问法(都是空间复杂度为常数级别):
- 矩阵左旋/右旋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; } } } };