給定乙個正整數 n,生成乙個包含 1 到 n2 所有元素,且元素按順時針順序螺旋排列的正方形矩陣。
示例:
輸入: 3
輸出:[
[ 1, 2, 3 ],
[ 8, 9, 4 ],
[ 7, 6, 5 ]
]
順時針畫矩陣的過程,用文字描述有:
1)從左到右,填充上行;
2)從上到下,填充右列;
3)從右到左,填充下行;
4)從下到上,填充左列;
四個為一圈往裡層畫。
這個操作不涉及知名演算法,主要是考驗**邊界條件的把控能力。
實現並不難,但一次就過佔少數,大部分人都需要輸出每乙個步驟後的矩陣狀態來除錯,細調邊界條件。
根據描述,第 1)橫著填充完後,執行 2)時會發現已經被 1)中填充了;
為了不重複填充,每個步驟之後都要矯正位置;
len:值為 n^2 表示主迴圈的邊界;
num:從1到n^2的計數 resv[i][j] 填入值;
il:i 的左邊界,每次操作後邊界需要縮小範圍;
ir:i 的右邊界,每次操作後邊界需要縮小範圍;
jl:j 的左邊界,每次操作後邊界需要縮小範圍;
jr:j 的右邊界,每次操作後邊界需要縮小範圍;
class solution
j=jr--; //邊界縮小範圍
i++; //矯正位置
while( i <= ir )
i=ir--;
j--;
while( j >= jl )
j=jl++;
i--;
while( i >= il )
i=il++;
j++;
}return resv;}};
一圈有四條邊,每條邊都保持左閉右開的原則n=3為例,有下圖:
n=4為例,有下圖:
loop:迴圈圈數,如上圖n=3,迴圈一圈,最後填充中心位置;
mid:當n為基數時,中心位置 resv[mid][mid] 直接填寫,不需要再迴圈;
count:從1到n^2的計數 resv[i][j] 填入值;
len:每次迴圈邊的長度,保證邊的左閉右開原則,初始值為n-1;一次迴圈之後邊長應該減2,因為左右兩側各已填寫;
class solution
if(n%2)
resv[mid][mid] = count;
return resv;}};
59 螺旋矩陣 II
給定乙個正整數 n,生成乙個包含 1 到 n2 所有元素,且元素按順時針順序螺旋排列的正方形矩陣。示例 輸入 3 輸出 1,2,3 8,9,4 7,6,5 class solution for int i 0 i 2 num 1 i 如果不是第乙個圈,個數需要減少1 if x 1 else r1 n...
59 螺旋矩陣 II
一輪 四種遍歷 後,將座標更新到新一輪的初始位置 x 1 y 1 初始步長 step n 1,之後更新步長 step 2 n為奇數時,最後四種遍歷完之後,再新增處於最中間的數 class solution def generatematrix self,n int list list int res...
59 螺旋矩陣 II
給定乙個正整數 n,生成乙個包含 1 到 n2 所有元素,且元素按順時針順序螺旋排列的正方形矩陣。示例 輸入 3 輸出 1,2,3 8,9,4 7,6,5 1 class solution 15 col 16 row 17 右列18 while col n 1 i rowi 22 row 23 co...