LeetCode-048-旋轉圖像

給定一個 n × n 的二維矩陣表示一個圖像。java

將圖像順時針旋轉 90 度。web

說明:數組

你必須在原地旋轉圖像,這意味着你須要直接修改輸入的二維矩陣。請不要使用另外一個矩陣來旋轉圖像。svg

示例 1:spa

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

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

給定 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]
]token

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

解題思路

首先明確, 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;
            }
        }
    }
}