归纳:
对于螺旋矩阵之类的题目有很多变形,但是除了边界条件不同外,都是两层循环的左右边界向外扩展或者向内收敛的问题,因此一般只要控制好循环左右上下边界的增减,问题便解决了
给定一个包含 m x n 个元素的矩阵(m 行, n列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。
示例 1:
代码语言:javascript复制输入:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
输出: [1,2,3,6,9,8,7,4,5]
示例 2:
代码语言:javascript复制输入:
[
[1, 2, 3, 4],
[5, 6, 7, 8],
[9,10,11,12]
]
输出: [1,2,3,4,8,12,11,10,9,5,6,7]
代码语言:javascript复制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 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。
示例:
代码语言:javascript复制输入: 3
输出:
[
[ 1, 2, 3 ],
[ 8, 9, 4 ],
[ 7, 6, 5 ]
]
代码语言:javascript复制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:
代码语言:javascript复制输入:R = 1, C = 4, r0 = 0, c0 = 0
输出:[[0,0],[0,1],[0,2],[0,3]]
示例 2:
代码语言:javascript复制输入: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
}