📑 题目:48. 旋转图像

🚀 本题 LeetCode 传送门

题目大意

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

解题思路

  • 给出一个二维数组,要求顺时针旋转 90 度。
  • 这一题比较简单,按照题意做就可以。这里给出 2 种旋转方法的实现,顺时针旋转和逆时针旋转。
  1. /*
  2. * clockwise rotate 顺时针旋转
  3. * first reverse up to down, then swap the symmetry
  4. * 1 2 3 7 8 9 7 4 1
  5. * 4 5 6 => 4 5 6 => 8 5 2
  6. * 7 8 9 1 2 3 9 6 3
  7. */
  8. void rotate(vector<vector<int> > &matrix) {
  9. reverse(matrix.begin(), matrix.end());
  10. for (int i = 0; i < matrix.size(); ++i) {
  11. for (int j = i + 1; j < matrix[i].size(); ++j)
  12. swap(matrix[i][j], matrix[j][i]);
  13. }
  14. }
  15. /*
  16. * anticlockwise rotate 逆时针旋转
  17. * first reverse left to right, then swap the symmetry
  18. * 1 2 3 3 2 1 3 6 9
  19. * 4 5 6 => 6 5 4 => 2 5 8
  20. * 7 8 9 9 8 7 1 4 7
  21. */
  22. void anti_rotate(vector<vector<int> > &matrix) {
  23. for (auto vi : matrix) reverse(vi.begin(), vi.end());
  24. for (int i = 0; i < matrix.size(); ++i) {
  25. for (int j = i + 1; j < matrix[i].size(); ++j)
  26. swap(matrix[i][j], matrix[j][i]);
  27. }
  28. }

代码

  1. package leetcode
  2. func rotate(matrix [][]int) {
  3. length := len(matrix)
  4. // rotate by diagonal 对角线变换
  5. for i := 0; i < length; i++ {
  6. for j := i + 1; j < length; j++ {
  7. matrix[i][j], matrix[j][i] = matrix[j][i], matrix[i][j]
  8. }
  9. }
  10. // rotate by vertical centerline 竖直轴对称翻转
  11. for i := 0; i < length; i++ {
  12. for j := 0; j < length/2; j++ {
  13. matrix[i][j], matrix[i][length-j-1] = matrix[i][length-j-1], matrix[i][j]
  14. }
  15. }
  16. }