59 螺旋矩陣 II

2021-10-12 03:37:46 字數 1419 閱讀 7151

給定乙個正整數 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...