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