題目鏈接:LeetCode 59. 螺旋矩陣 II 本題不涉及演算法,只是簡單的模擬,但是由於邊界條件比較多,因此容易出錯。 分析題乾:題目要求按照右、下、左、上、這樣的順序對數組進行填充,填充的值為 1 ~ n*n,因此問題的關鍵就是找到待填充的位置,將其值賦值為 i 即可。 由於填充的順序是有規律 ...
題目鏈接:LeetCode 59. 螺旋矩陣 II
本題不涉及演算法,只是簡單的模擬,但是由於邊界條件比較多,因此容易出錯。
分析題乾:題目要求按照右、下、左、上、這樣的順序對數組進行填充,填充的值為 1 ~ n*n
,因此問題的關鍵就是找到待填充的位置,將其值賦值為 i
即可。
由於填充的順序是有規律的,因此可以將 右、下、左、上、這四種填充方式看作成四個方向上的移動,此時就可以發現:
- 當向右填充時,橫坐標不變,縱坐標 +1
- 當向下填充時,橫坐標 +1,縱坐標不變
- 當向左填充時,橫坐標不變,縱坐標 -1
- 當向上填充時,橫坐標 -1,縱坐標不變
因此對於四個方向上的橫縱坐標的變化,可以用兩個數組進行表示:
dx :=[]int{0,1,0,-1} //四種移動方向,右、下、左、上 dx表示行,dy表示列
dy :=[]int{1,0,-1,0}
此時在移動過程中,橫縱坐標的變化,就是 a=x+dx[d]
和 b=y+dy[d]
(這裡d 表示移動的方向,取值為0,1,2,3)
當發現需要改變移動方向時,即到達數組邊界時,採用取餘的操作,更新移動方向 d=(d+1)%4
這樣,迴圈填充下去,直到填充到 n*n 為止。
完整代碼如下:
func generateMatrix(n int) [][]int {
res:=make([][]int,n)
for i,_ :=range res{
res[i] = make([]int,n)
}
dx :=[]int{0,1,0,-1} //四種移動操作,右、下、左、上 dx表示行,dy表示列
dy :=[]int{1,0,-1,0}
// i表示數值i,初始時為1, x,y表示當前位置的橫縱坐標,d表示當前移動的方向
for i,x,y,d:=1,0,0,0;i <= n*n;i++{
res[x][y] = i //將當前位置填上i
a := x + dx[d] //將當前位置按照當前的方向,更新成新的位置(a,b)即求得當前方向的下一個格子位置
b := y + dy[d]
if a < 0 || b < 0 || a >=n || b >= n ||res[a][b] != 0{ //如果下一個格子越界 或者 這個格子已經有數
d=(d+1)%4 //換下一個方向
a=x+dx[d]
b=y+dy[d] //得到新的格子位置
}
x=a //更新待填寫的格子的位置
y=b
}
return res
}
當然你也可以分別去處理右、下、左、上 四個方向的情況,代碼如下:
func generateMatrix(n int) [][]int {
top, bottom := 0, n-1
left, right := 0, n-1
num := 1
tar := n * n
matrix := make([][]int, n)
for i := 0; i < n; i++ {
matrix[i] = make([]int, n)
}
for num <= tar {
for i := left; i <= right; i++ {
matrix[top][i] = num
num++
}
top++
for i := top; i <= bottom; i++ {
matrix[i][right] = num
num++
}
right--
for i := right; i >= left; i-- {
matrix[bottom][i] = num
num++
}
bottom--
for i := bottom; i >= top; i-- {
matrix[i][left] = num
num++
}
left++
}
return matrix
}