54. Spiral Matrix

leetcode

Posted by chl on May 7, 2019

题目

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没有理清楚导致的。