歸納:
對於螺旋矩陣之類的題目有很多變形,但是除了邊界條件不同外,都是兩層循環的左右邊界向外擴展或者向內收斂的問題,因此一般只要控制好循環左右上下邊界的增減,問題便解決了
給定一個包含 m x n 個元素的矩陣(m 行, n列),請按照順時針螺旋順序,返回矩陣中的所有元素。
示例 1:
輸入:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
輸出: [1,2,3,6,9,8,7,4,5]
示例 2:
輸入:
[
[1, 2, 3, 4],
[5, 6, 7, 8],
[9,10,11,12]
]
輸出: [1,2,3,4,8,12,11,10,9,5,6,7]
func spiralOrder(matrix [][]int) []int { if len(matrix) < 1 { return []int{} } left := 0 up := 0 down := len(matrix) - 1 right := len(matrix[0]) - 1 var r []int for left <= right && up <= down { for i := left; i <= right; i++ { r = append(r, matrix[up][i]) } for j := up + 1; j <= down; j++ { r = append(r, matrix[j][right]) } if left < right && up < down { for i := right - 1; i >= left; i-- { r = append(r, matrix[down][i]) } for j := down - 1; j >= up+1; j-- { r = append(r, matrix[j][left]) } }
left++ right-- up++ down-- fmt.Println(r) } return r}給定一個正整數 n,生成一個包含 1 到 n2 所有元素,且元素按順時針順序螺旋排列的正方形矩陣。
示例:
輸入: 3
輸出:
[
[ 1, 2, 3 ],
[ 8, 9, 4 ],
[ 7, 6, 5 ]
]func generateMatrix(n int) [][]int { if n < 1 { return [][]int{} } left := 0 up := 0 down := n - 1 right := n - 1 r:=make([][]int,n) for i:=0;i<n;i++{ r[i]=make([]int,n) } k:=1 for left <= right && up <= down { for i := left; i <= right; i++ { r[up][i]=k k++ } for j := up + 1; j <= down; j++ { r[j][right]=k k++ } if left < right && up < down { for i := right - 1; i >= left; i-- { r[down][i]=k k++ } for j := down - 1; j >= up+1; j-- { r[j][left]=k k++ } }
left++ right-- up++ down-- } return r}在 R 行 C 列的矩陣上,我們從 (r0, c0) 面朝東面開始
這裡,網格的西北角位於第一行第一列,網格的東南角位於最後一行最後一列。
現在,我們以順時針按螺旋狀行走,訪問此網格中的每個位置。
每當我們移動到網格的邊界之外時,我們會繼續在網格之外行走(但稍後可能會返回到網格邊界)。
最終,我們到過網格的所有 R * C 個空間。
按照訪問順序返回表示網格位置的坐標列表。
示例 1:
輸入:R = 1, C = 4, r0 = 0, c0 = 0
輸出:[[0,0],[0,1],[0,2],[0,3]]
示例 2:
輸入:R = 5, C = 6, r0 = 1, c0 = 4
輸出:[[1,4],[1,5],[2,5],[2,4],[2,3],[1,3],[0,3],[0,4],[0,5],[3,5],[3,4],[3,3],[3,2],[2,2],[1,2],[0,2],[4,5],[4,4],[4,3],[4,2],[4,1],[3,1],[2,1],[1,1],[0,1],[4,0],[3,0],[2,0],[1,0],[0,0]]
提示:
1 <= R <= 100
1 <= C <= 100
0 <= r0 < R
0 <= c0 < C
func spiralMatrixIII(R int, C int, r0 int, c0 int) [][]int {
if R <=0 || C<=0 { return [][]int{} } a := make([][]int, R) for i := 0; i < R; i++ { a[i] = make([]int, C) } k := 1 right := 1 down := 1 left := 0 up := 0 a[r0][c0] = k k++ var r [][]int r=append(r,[]int{r0,c0}) for c0+right < C || r0+down < R || c0-left >= 0 || r0-up >= 0 { for i := c0 - left + 1; i <= c0+right; i++ { if r0-up >= 0 && i < C && i>=0 { a[r0-up][i] = k k++ r=append(r,[]int{r0-up,i}) } } fmt.Println(a) for j := r0 - up + 1; j <= r0+down; j++ { if c0+right < C && j < R && j>=0{ a[j][c0+right] = k k++ r=append(r,[]int{j,c0+right}) } } fmt.Println(a) for i := c0 + right - 1; i >= c0-left-1; i-- { if r0+down < R && i>=0 && i<C { a[r0+down][i] = k k++ r=append(r,[]int{r0+down,i}) } } fmt.Println(a) for j := r0 + down - 1; j >= r0-up-1; j-- { if j >= 0 && c0-left-1 >= 0 && j<R { a[j][c0-left-1] = k k++ r=append(r,[]int{j,c0-left-1}) } } fmt.Println(a) left++ up++ right++ down++
} return r}推薦閱讀
喜歡本文的朋友,歡迎關注「Go語言中文網」:
Go語言中文網啟用微信學習交流群,歡迎加微信:274768166