题解
func spiralOrder(matrix [][]int) []int {
if len(matrix) == 0 || len(matrix[0]) == 0 {
return nil
}
// 记录访问过多少个元素
var visited int
var size = len(matrix) * len(matrix[0])
var left, right = 0, len(matrix[0]) - 1
var top, down = 0, len(matrix) - 1
var result = make([]int, 0)
for visited < size {
// 左 --> 右
for i := left; i <= right && visited < size; i++ {
result = append(result, matrix[top][i])
visited++
}
top++
// 上 --> 下
for i := top; i <= down && visited < size; i++ {
result = append(result, matrix[i][right])
visited++
}
right--
// 右 --> 左
for i := right; i >= left && visited < size; i-- {
result = append(result, matrix[down][i])
visited++
}
down--
// 下 --> 上
for i := down; i >= top && visited < size; i-- {
result = append(result, matrix[i][left])
visited++
}
left++
}
return result
}
要点
-
从外圈向里,按照从 左-->右-->下-->上的方向扫描矩阵。扫描完一圈之后更新四周边界的值。
-
扫描的过程中需要实时检测已访问元素个数和矩阵元素总个数的关系,避免剩余单行或者单列数据时,出现重复扫描的情况。