算法题-旋转图像

  1. 矩阵旋转操作总结

https://leetcode.cn/problems/rotate-image/

代码:

class Solution {
public:
    void rotate(vector<vector<int>>& matrix) {
        int n = matrix.size();

        for (int i = 0; i < n; i ++) {
            for (int j = 0; j < i; j ++) {
                swap(matrix[i][j], matrix[j][i]);
            }
        }
        for (int i = 0; i < n; i ++) {
            for (int j = 0, k = n - 1; j < k; j ++, k --) {
                swap(matrix[i][j], matrix[i][k]);
            }
        }
    }
};

矩阵旋转操作总结

  • 顺时针90度: 主对角线(左上到右下)翻转, 然后按中间线左右反转.
  • 逆时针90度: 主对角线(左上到右下)翻转, 然后按中间线上下翻转.
  • 180度: 主对角线翻转, 副对角线翻转.

主对角线翻转写法:

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 - 1 - i; j ++) {
    swap(matrix[i][j], matrix[j][i]);
  }
}

中间线左右翻转.

for (int i = 0; i < n; i ++ )
   for (int j = 0, k = n - 1; j < k; j ++, k -- )
    swap(matrix[i][j], matrix[i][k]);

中间线上下翻转:

for (int i = 0, k = n - 1; i < k; i ++, k --) {
  for (int j = 0; j < n; j ++) {
    swap(matrix[i][j], matrix[k][j]);
  }
}