給定一個正整數 n,生成一個包含 1 到 n2 所有元素,且元素按順時針順序螺旋排列的正方形矩陣。
示例:
輸入: 3
輸出:
[
[ 1, 2, 3 ],
[ 8, 9, 4 ],
[ 7, 6, 5 ]
]
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/spiral-matrix-ii
解題思路
受到 LeetCode-048-旋轉圖像 的啟發
也是將矩陣每一層分割為等大的四部分
然后用兩層循環, 外層循環次數為層數, 層數 = (n + 1) / 2
內層循環次數是每層等大的四部分的長度, 為 n - 層數(從0開始) * 2 - 1
四部分分別是上右下左
且規律是 右部分的第 i 個元素 = 上部分的第 i 個位置的元素 + 該層每部分長度
下部分的第 i 個元素 = 右部分的第 i 個位置的元素 + 該層每部分長度
左部分的第 i 個元素 = 下部分的第 i 個位置的元素 + 該層每部分長度
所以只需要確定每層上部分的第一個元素, 隨后填滿這一層
最后注意如果 n 是奇數, 需要補充最中間的數字
代碼
class Solution {
public int[][] generateMatrix(int n) {
int[][] result = new int[n][n];
// 層數 = (n + 1) / 2
int layer = (n + 1) / 2;
// 填的數字
int num = 1;
for (int i = 0; i < layer; i++) {
// 每一層分成四部分, 每部分的長度
int partLength = n - i * 2 - 1;
int start = num;
for (int j = 0; j < partLength; j++) {
// result[i][i + j] 上
// result[i + j][n - i - 1] 右
// result[n - i - 1][n - i - 1 - j] 下
// result[n - i - 1 - j][i] 左
result[i][i + j] = start + j;
result[i + j][n - i - 1] = result[i][i + j] + partLength;
result[n - i - 1][n - i - 1 - j] = result[i + j][n - i - 1] + partLength;
result[n - i - 1 - j][i] = result[n - i - 1][n - i - 1 - j] + partLength;
}
// 下一層的起始數字
num = num + partLength * 4;
}
// 如果n是奇數, 還需要補上最中間的元素
if ((n & 0x1) == 0x1) {
result[n / 2][n / 2] = n * n;
}
return result;
}
}