输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
示例 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]
限制:
0 <= matrix.length <= 100
0 <= matrix[i].length <= 100
题解思路:统计一下步数,定义好边界,按照从左到右,从上到下,从右到左,从下到上四个方向访问数组即可
代码实现 :
func spiralOrder(matrix [][]int) []int {
// 如果待处理的数组是空的,直接返回nil
if len(matrix) == 0 {
return nil
}
// 初始化返回结果数组
res := make([]int, 0)
// 矩阵的高度与长度
spiralLength, spiralHeight := len(matrix[0]), len(matrix)
// 定义上下左右四个方向(边界)
up, down, left, right := 0, spiralHeight - 1, 0, spiralLength - 1
// 总共的步数 m * n, 其实就是矩阵的大小
size := spiralLength * spiralHeight
var (
step, i int
)
// 开始遍历矩阵
for step = 0; step < size; {
// 从左到右遍历数组, up方向不动,最上边界遍历
for i = left; i <= right && step < size; i++ {
res = append(res, matrix[up][i])
step++
}
up++
// 从上到下遍历数组,right方向不动,最右边界遍历
for i = up; i <= down && step < size; i++ {
res = append(res, matrix[i][right])
step++
}
right--
// 从右到左遍历数组,down方向不动,最下边界遍历
for i = right; i >= left && step < size; i-- {
res = append(res, matrix[down][i])
step++
}
down--
// 从下到上遍历数组,left方向不变,最左边界遍历
for i = down; i >= up && step < size; i-- {
res = append(res, matrix[i][left])
step++
}
left++
}
return res
}
网友评论