解法一:模拟法
矩阵打印类的题目,大部分只能直接模拟规则执行了,注意处理边界问题
可以发现,顺时针打印矩阵的顺序是 “从左向右、从上向下、从右向左、从下向上” 循环
因此,考虑设定矩阵的 “左、上、右、下” 四个边界,模拟以上矩阵遍历顺序。
func spiralOrder(matrix [][]int) []int {
l, r, t, b := 0, len(matrix[0])-1, 0, len(matrix)-1 // 上下左右4条边界线
res := make([]int, 0)
for l <= r && t <= b {
// step1, 上方从左到右打印
for j := l; j<=r; j++{
res = append(res, matrix[t][j])
}
t++ // 收缩上边界
if t > b{ // 防止越界,下同
break
}
// step2, 右方从上到下打印
for i := t; i<=b; i++{
res = append(res, matrix[i][r])
}
r-- // 收缩右边界
if r < l{
break
}
// step3, 下方从右到左打印
for j := r; j >=l; j--{
res = append(res, matrix[b][j])
}
b-- // 下边界收缩
if b < t {
break
}
// step4, 左方从下到上打印
for i := b; i >= t; i--{
res = append(res, matrix[i][l])
}
l++ // 左边界收缩
// l在下次循环开始被检查,不需要额外的break
}
return res
}