LeetCode刷题笔记——模拟(54. 螺旋矩阵)-Go语言

LeetCode刷题笔记——模拟(54. 螺旋矩阵)-Go语言

54.螺旋矩阵 中等

给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。

示例 1:

LeetCode刷题笔记——模拟(54. 螺旋矩阵)-Go语言_第1张图片

输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]

示例 2:

LeetCode刷题笔记——模拟(54. 螺旋矩阵)-Go语言_第2张图片

输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
输出:[1,2,3,4,8,12,11,10,9,5,6,7]

提示:

m == matrix.length
n == matrix[i].length
1 <= m, n <= 10
-100 <= matrix[i][j] <= 100

思路:

  • 从数据结构入手写个位置向量栈
  • 向走迷宫一样模拟螺旋路径
// 位置向量结构体
type Pos struct{ x, y, dir, num int }

// 位置向量栈
type stack []Pos

// 入栈
func (this *stack) Push(p Pos) {
	(*this) = append((*this), p)
}

// 长度
func (this stack) Size() int { return len(this) }

// 出栈
func (this *stack) Pop() Pos {
	res := (*this)[this.Size()-1]
	(*this) = (*this)[0 : this.Size()-1]
	return res
}

// 栈顶
func (this stack) Top() Pos {
	return this[this.Size()-1]
}

// 输出顺序值切片
func (this stack) getArr() []int {
	n := this.Size()
	ans := make([]int, n)
	for i := 0; i < n; i++ {
		ans[i] = this[i].num
	}
	return ans
}

// 像走迷宫一样来回转圈圈儿
func spiralOrder(matrix [][]int) []int {
	n := len(matrix)
	m := len(matrix[0])
	var x, y int
	var pStk stack
	times := n * m
	var pos = Pos{x, y, 0, matrix[x][y]}
	pStk.Push(pos)
	for i := 0; i < times; i++ {
		pos = pStk.Top()
		matrix[pos.x][pos.y] = 0x3f3f // 表示走过
		for matrix[pos.x][pos.y] == 0x3f3f && pStk.Size() != times {
			switch pos.dir {
			case 0: // 右
				x, y = pos.x, pos.y+1
			case 1: // 下
				x, y = pos.x+1, pos.y
			case 2: // 左
				x, y = pos.x, pos.y-1
			case 3: // 上
				x, y = pos.x-1, pos.y
			}
			if x >= 0 && x < n && y >= 0 && y < m && matrix[x][y] != 0x3f3f {
				pos.x, pos.y, pos.num = x, y, matrix[x][y]
				pStk.Push(pos)
			} else {
				pos.dir++
				pos.dir %= 4 // 呈环形方向旋转
			}
		}
	}
	return pStk.getArr()
}

你可能感兴趣的:(力扣,Go语言,golang,算法,数据结构)