题目
Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral order.
题意
顺时针螺旋输出数组元素
题解
并没有太多复杂的解法,就只是单纯的按顺时针顺序一个一个输出,只是要注意好细节问题,每次按一个方向输出,一个方向上就需要固定行或列,然后遍历列或者行;同时使用一个辅助数组来标记已经输出的元素以表示输出边界。
代码
var use [][]bool //标记数组
var ans []int
var m,n int
func spiralOrder(matrix [][]int) []int {
ans = make([]int,0)
m = len(matrix)
if m==0{
return ans
}
n = len(matrix[0])
if n==0{
return ans
}
use = make([][]bool,m)
for i,_ :=range use{
use[i] = make([]bool,n)
}
var way = 0 //输出方向
fix,floatStart:=0,0 //固定位置以及输出的起始位置
for len(ans)!=m*n{
switch(way){
case 0:
fix,floatStart = right(fix,floatStart,matrix)
way = newWay(way)
case 1:
fix,floatStart = down(fix,floatStart,matrix)
way = newWay(way)
case 2:
fix,floatStart = left(fix,floatStart,matrix)
way = newWay(way)
case 3:
fix,floatStart = up(fix,floatStart,matrix)
way = newWay(way)
}
}
return ans
}
func newWay(way int)int{
return (way+1)%4
}
func right(fix , floatStart int,matrix [][]int)(int,int){
var i int
for i=floatStart;i<n&&!use[fix][i];i++{
ans = append(ans,matrix[fix][i])
use[fix][i] = true
}
i--
return i,fix+1
}
func down(fix,floatStart int,matrix [][]int)(int,int){
var i int
for i=floatStart;i<m&&!use[i][fix];i++{
ans = append(ans,matrix[i][fix])
use[i][fix] = true
}
i--
return i,fix-1
}
func left(fix,floatStart int,matrix [][]int)(int,int){
var i int
for i=floatStart;i>=0&&!use[fix][i];i--{
ans = append(ans,matrix[fix][i])
use[fix][i] = true
}
i++
return i,fix-1
}
func up(fix,floatStart int,matrix [][]int)(int,int){
var i int
for i=floatStart;i>=0&&!use[i][fix];i--{
ans = append(ans,matrix[i][fix])
use[i][fix] = true
}
i++
return i,fix+1
}
总结
遇到的bug,数组越界,主要是方向变换时fix和float没有理清楚导致的。