54. 螺旋矩阵

题目#

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

示例 1:

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

示例 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

思路#

原本是想要在处理过程中将该矩阵“旋转”的,可惜没处理好(

于是就换成了手动维护上下左右四个边界,不断缩小未处理矩阵的大小。

代码#

func spiralOrder(matrix [][]int) []int {
res := []int{}
// 四个边界
var (
up = 0
down = len(matrix) - 1
left = 0
right = len(matrix[0]) - 1
)
for {
// 左 -> 右
for i := left; i <= right; i++ {
res = append(res, matrix[up][i])
}
// 左 -> 右一趟结束后,最上一层数组就被处理完了
// 因此要改变 up,其他同理
// 注意检查是否越界
up++
if up > down {
break
}
// 上 -> 下
for i := up; i <= down; i++ {
res = append(res, matrix[i][right])
}
right--
if right < left {
break
}
// 右 -> 左
for i := right; i >= left; i-- {
res = append(res, matrix[down][i])
}
down--
if down < up {
break
}
// 下 -> 上
for i := down; i >= up; i-- {
res = append(res, matrix[i][left])
}
left++
if left > right {
break
}
}
return res
}
Last updated on