leetcode:48. 旋转图像

题目

给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。
你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。

示例 1:
[中等] 48. 旋转图像 - 图1

  1. 输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
  2. 输出:[[7,4,1],[8,5,2],[9,6,3]]

示例 2:
[中等] 48. 旋转图像 - 图2

  1. 输入:matrix = [[5,1,9,11],[2,4,8,10],[13,3,6,7],[15,14,12,16]]
  2. 输出:[[15,13,2,5],[14,3,4,1],[12,6,8,9],[16,7,10,11]]

解答 & 代码

上下翻转 + 主对角线翻转

  1. 1 2 3 7 8 9 7 4 1
  2. 4 5 6 --上下翻转--> 4 5 6 --沿主对角线翻转--> 8 5 2
  3. 7 8 9 1 2 3 9 6 3
  1. class Solution {
  2. public:
  3. void rotate(vector<vector<int>>& matrix) {
  4. if(matrix.size() == 0 || matrix[0].size() == 0)
  5. return;
  6. int rows = matrix.size();
  7. int cols = matrix.size();
  8. // 上下翻转
  9. int up = 0;
  10. int down = rows - 1;
  11. while(up < down)
  12. {
  13. for(int j = 0; j < cols; ++j)
  14. swap(matrix[up][j], matrix[down][j]);
  15. ++up;
  16. --down;
  17. }
  18. // 沿主对角线翻转
  19. for(int i = 0; i < rows; ++i)
  20. {
  21. for(int j = i + 1; j < cols; ++j)
  22. swap(matrix[i][j], matrix[j][i]);
  23. }
  24. }
  25. };

复杂度分析:二维矩阵行数、列数都为 n

  • 时间复杂度 [中等] 48. 旋转图像 - 图3
  • 空间复杂度 O(1):

执行结果:

  1. 执行结果:通过
  2. 执行用时:4 ms, 在所有 C++ 提交中击败了 45.02% 的用户
  3. 内存消耗:6.8 MB, 在所有 C++ 提交中击败了 88.15% 的用户