1. 程式人生 > >LeetCode : 48. 旋轉影象(Rotate Image)解答

LeetCode : 48. 旋轉影象(Rotate Image)解答

48. 旋轉影象

給定一個 n × n 的二維矩陣表示一個影象。

將影象順時針旋轉 90 度。

說明:

你必須在 原地 旋轉影象,這意味著你需要直接修改輸入的二維矩陣。請不要 使用另一個矩陣來旋轉影象。

示例 1:

給定 matrix =
[
    [1,2,3],
    [4,5,6],
    [7,8,9]
],

原地旋轉輸入矩陣,使其變為:
[
    [7,4,1],
    [8,5,2],
    [9,6,3]
]

示例 2:

給定 matrix =
[
    [ 5, 1, 9,11],
    [ 2, 4, 8,10],
    [13, 3, 6, 7],
    [15,14,12,16]
],

原地旋轉輸入矩陣,使其變為:
[
    [15,13, 2, 5],
    [14, 3, 4, 1],
    [12, 6, 8, 9],
    [16, 7,10,11]
]

一、分析

首先我們只能在原矩陣上進行操作,而不可以藉助另一個矩陣。其次這是一個特殊的二維矩陣,列數和行數是相等的,通常稱之為方陣。所以我們剩下的只需要理清楚怎麼旋轉90°即可。

圖示:

在這裡插入圖片描述

規律:

  1. 旋轉90°即:A[0,0] 轉到 A[0,n] 位置;A[0,n] 轉到 A[n,n] 位置;A[n,n] 轉到 A[n,0] 位置;A[n,0] 轉到 A[0,0] 位置。然後依次類推
  2. 上一步操作的是最外層的一層 ,我們只需要一層層往裡執行相同的操作,最終即可完成整個矩陣的旋轉
  3. 假設矩陣是 n*n 的,那麼我們對 n/2 個環執行旋轉即可完成
  4. 對於任一層的環,假如其實索引為 start
    ,終止索引為 end,那麼左上右下四個點分別可有表示為:A[start][start]A[start][end]A[end][start]A[end][end]
  5. 某層環內的迴圈規律即 A[start][start->end]A[start->end][end]A[end->start][start]A[end->start][end]。箭頭表示遞變情況

二、解答

/**
 * Copyright © 2018 by afei. All rights reserved.
 * 
 * @author: afei
 * @date: 2018年11月17日
 */

public class Soution {

    public static void main(String[] args) {
        int[][] matrix_3x3 = { { 1, 2, 3 },
                               { 4, 5, 6 },
                               { 7, 8, 9 } };
        rotate(matrix_3x3);
        printMatrix(matrix_3x3);
        System.out.println("*****************************");
        int[][] matrix_4x4 = { { 5,  1,  9,  11 },
                               { 2,  4,  8,  10 },
                               { 13, 3,  6,  7  },
                               { 15, 14, 12, 16 } };
        rotate(matrix_4x4);
        printMatrix(matrix_4x4);
    }

    public static void rotate(int[][] matrix) {
        int len = matrix.length;
        for (int i = 0; i < len / 2; i++) {
            int start = i; // 當前環的起始下標(橫縱均相等)
            int end = len - i - 1; // 當前環的終點下標(橫縱均相等)
            for (int j = 0; j < end - start; j++) {
                int temp = matrix[start][start + j];
                matrix[start][start + j] = matrix[end - j][start];
                matrix[end - j][start] = matrix[end][end - j];
                matrix[end][end - j] = matrix[start + j][end];
                matrix[start + j][end] = temp;
            }
        }
    }

    public static void printMatrix(int[][] matrix) {
        for (int i = 0; i < matrix.length; i++) {
            for (int j = 0; j < matrix[i].length; j++) {
                System.out.print(matrix[i][j] + "\t");
            }
            System.out.println();
        }
    }
}

三、專案地址

https://github.com/afei-cn/LeetCode/tree/master/48.%20Rotate%20Image

四、原題地址

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