gogogo

需要注意到矩阵为空、单行、单列的情况

func spiralOrder( matrix [][]int ) []int {
    // write code here
    res := []int{}
        //判断矩阵是否为空:为空时返回
    if len(matrix) == 0{
        return res
    }
    //初始化
    top := 0
    bottom := len(matrix)-1
    left := 0
    right := len(matrix[0])-1
    //矩阵不为空时进行循环遍历,首先从左到右,再从上到下,再从右到左,再从下到上
    for top <= bottom && left <= right{
        //当上下重叠或者左右重叠时终止循环
        for i := left;i <= right;i++{
            res = append(res,matrix[top][i])
        }    //从左到右遍历,变的是列
        top++    //每次遍历完下移一行,为下一个遍历做准备
        for i := top;i <= bottom;i++{
            res = append(res,matrix[i][right])
        }    //从上到下遍历,变的是行。单行时未执行该循环
        right--    //每遍历完左移一列,为下一个遍历做准备
        if top > bottom || left > right{
            break
        }    //单行单列,后续不用执行
        for i := right;i >= left;i--{
            res = append(res,matrix[bottom][i])
        }    //从右向左遍历,变的是列
        bottom--    //每遍历一次初始位都要左移一位,为下次遍历做准备
        for i := bottom;i >= top;i--{
            res = append(res,matrix[i][left])
        }    //从下向上遍历,变的是行
        left++    //每一次遍历初始位都要上移一位,为下次遍历做准备
    } 
    return res
}