LeetCode54 螺旋矩阵

66 阅读1分钟

leetcode.cn/problems/sp…

image.png

解法一:模拟法

矩阵打印类的题目,大部分只能直接模拟规则执行了,注意处理边界问题

可以发现,顺时针打印矩阵的顺序是  “从左向右、从上向下、从右向左、从下向上”  循环

因此,考虑设定矩阵的 “左、上、右、下” 四个边界,模拟以上矩阵遍历顺序。

image.png

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
}