题目
给定一个 m*n
的矩阵,以顺时针螺旋的形式返回所有的元素。
解析
走法是固定给出的,只需要确定终止条件即可。对于这个 m*n
的矩阵,我们先确定上下左右,四条边界,即top,bottom,left,right。螺旋在每一个边界上的方向都是固定的。首先,我们在 top 上移动,当移动到右边界时,判断bottom是否大于top,如果是,就调整方向沿着 right 移动,如果不是,说明已经终结。
伪代码
top = 0
bottom = m-1
left = 0
right = n-1
// top 移动
for {
for i=left;i<=right;i++
rst+=matrix[top][i]
top--
if bottom < top
return
for i=top;i<=bottom;i++
rst+=matrix[i][right]
right--
if right < left
return
for i=right;i>=left; i--
rst+=matrix[bottom][i]
bottom--
if bottom < top
return
for i= bottom;i>=top;i--
rst+=matrix[left][i]
left--
if right<left
return
}
代码
func spiralOrder(matrix [][]int) []int {
nums := make([]int, len(matrix)*len(matrix[0]))
cnt:=0
top,bottom,left,right := 0,len(matrix)-1, 0, len(matrix[0])-1
for {
for i:=left;i<=right;i++ {
nums[cnt] = matrix[top][i]
cnt++
}
top++
if bottom < top {
break
}
for i:=top;i<=bottom;i++ {
nums[cnt] = matrix[i][right]
cnt++
}
right--
if right < left {
break
}
for i:=right;i>=left;i-- {
nums[cnt]=matrix[bottom][i]
cnt++
}
bottom--
if bottom < top {
break
}
for i:=bottom;i>=top;i-- {
nums[cnt] = matrix[i][left]
cnt++
}
left++
if right < left {
break
}
}
return nums
}
image.png
网友评论