题目描述
给你一个 m
行 n
列的矩阵 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 := make([]int, 0)
// 定义边界
left, right := 0, len(matrix[0]) - 1
top, bottom := 0, len(matrix) - 1
// 循环遍历螺旋矩阵
for {
// 从左到右遍历上边界
for i := left; i <= right; i++ {
res = append(res, matrix[top][i])
}
// 上边界向下移动
top++
// 检查是否越界
if top > bottom {
break
}
// 从上到下遍历右边界
for i := top; i <= bottom; i++ {
res = append(res, matrix[i][right])
}
// 右边界向左移动
right--
// 检查是否越界
if right < left {
break
}
// 从右到左遍历下边界
for i := right; i >= left; i-- {
res = append(res, matrix[bottom][i])
}
// 下边界向上移动
bottom--
// 检查是否越界
if top > bottom {
break
}
// 从下到上遍历左边界
for i := bottom; i >= top; i-- {
res = append(res, matrix[i][left])
}
// 左边界向右移动
left++
// 检查是否越界
if left > right {
break
}
}
// 返回结果数组
return res
}
通过维护四个边界来按螺旋顺序遍历矩阵,并将遍历的元素存储在结果数组res
中。