LeetCode-048-旋轉影像

Gogoing_刻苦驢發表於2020-12-05

給定一個 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]
]

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/rotate-image

解題思路

首先明確, n * n 的陣列, 忽略最中間那一格, “層數” <= n / 2
然後將每一層看為四個"該層長度 - 1"的部分, 上右下左四部分
然後兩層迴圈, 外層迴圈"層數", 內層迴圈"該層長度 - 1"
然後將每層的四部分數字交換
只要畫個圖弄清楚每個部分元素的索引就很好解決
matrix[layer][layer + i] // 上
matrix[layer + i][length - layer - 1] // 右
matrix[length - layer - 1][length - layer - 1 - i] // 下
matrix[length - layer - i - 1][layer] // 左
layer是層數, i是每層的每個部分的元素的偏移量

程式碼

class Solution {
    public void rotate(int[][] matrix) {
        int length = matrix.length;
        if (length == 0) {
            return;
        }
        // 層數不超過陣列長度 / 2
        for (int layer = 0; layer < length / 2; layer++) {
            // 將每一層分為四個該層長度 - 1的
            for (int i = 0; i < length - layer * 2 - 1; i++) {
//              matrix[layer][layer + i]; // 上
//              matrix[layer + i][length - layer - 1]; // 右
//              matrix[length - layer - 1][length - layer - 1 - i]; // 下
//              matrix[length - layer - i - 1][layer]; // 左
                int temp = matrix[layer][layer + i];
                matrix[layer][layer + i] = matrix[length - layer - i - 1][layer];
                matrix[length - layer - i - 1][layer] = matrix[length - layer - 1][length - layer - 1 - i];
                matrix[length - layer - 1][length - layer - 1 - i] = matrix[layer + i][length - layer - 1];
                matrix[layer + i][length - layer - 1] = temp;
            }
        }
    }
}

相關文章