难度

  • 简单
  • 中等
  • 困难

    标签

    数组

    题目描述

    给你一幅由 N × N 矩阵表示的图像,其中每个像素的大小为 4 字节。请你设计一种算法,将图像旋转 90 度。
    不占用额外内存空间能否做到?

    示例1:

    ```java 给定 matrix = [ [1,2,3], [4,5,6], [7,8,9] ],

原地旋转输入矩阵,使其变为: [ [7,4,1], [8,5,2], [9,6,3] ]

  1. <a name="TTCnl"></a>
  2. ### 实例2:
  3. ```java
  4. 给定 matrix =
  5. [
  6. [ 5, 1, 9,11],
  7. [ 2, 4, 8,10],
  8. [13, 3, 6, 7],
  9. [15,14,12,16]
  10. ],
  11. 原地旋转输入矩阵,使其变为:
  12. [
  13. [15,13, 2, 5],
  14. [14, 3, 4, 1],
  15. [12, 6, 8, 9],
  16. [16, 7,10,11]
  17. ]

题解

1. 水平轴翻转 + 对角线翻转

  1. class Solution {
  2. public void rotate(int[][] matrix) {
  3. int n = matrix.length;
  4. // 水平翻转
  5. for (int i = 0; i < n / 2; ++i) {
  6. for (int j = 0; j < n; ++j) {
  7. int temp = matrix[i][j];
  8. matrix[i][j] = matrix[n - i - 1][j];
  9. matrix[n - i - 1][j] = temp;
  10. }
  11. }
  12. // 主对角线翻转
  13. for (int i = 0; i < n; ++i) {
  14. for (int j = 0; j < i; ++j) {
  15. int temp = matrix[i][j];
  16. matrix[i][j] = matrix[j][i];
  17. matrix[j][i] = temp;
  18. }
  19. }
  20. }
  21. }

2. 找规律旋转

  1. class Solution {
  2. public void rotate(int[][] matrix) {
  3. int n = matrix.length;
  4. for (int i = 0; i < n / 2; ++i) {
  5. for (int j = 0; j < (n + 1) / 2; ++j) {
  6. int temp = matrix[i][j];
  7. matrix[i][j] = matrix[n - j - 1][i];
  8. matrix[n - j - 1][i] = matrix[n - i - 1][n - j - 1];
  9. matrix[n - i - 1][n - j - 1] = matrix[j][n - i - 1];
  10. matrix[j][n - i - 1] = temp;
  11. }
  12. }
  13. }
  14. }