这一问题可以有如下问法(都是空间复杂度为常数级别):

  1. 矩阵左旋/右旋90度
  2. 矩阵左旋/右旋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;
            }
        }
    }
};