【剑指offer】螺旋矩阵 [Go语言]

162 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情

题目

给定一个m x n大小的矩阵(m行,n列),按螺旋的顺序返回矩阵中的所有元素。

示例1

输入:

[[1,2,3],[4,5,6],[7,8,9]]

返回值:

[1,2,3,6,9,8,7,4,5]

螺旋矩阵,这里就是不断遍历,第一行从左到右,最后一列从上到下,最后一行,从右到左,在第一列从下到上

AC Code

func spiralOrder( matrix [][]int ) []int {
    // write code here
    if len(matrix) == 0{
        return nil
    }
(1)    row,col := len(matrix)-1,len(matrix[0])-1
(2)    rowlow,collow := 0, 0 
(3)    res := []int{}
    for {
(4)        for i:=collow;i<=col;i++{
(5)            res = append(res,matrix[rowlow][i])
        }
(6)        rowlow++
(7)        if rowlow>row{
(8)            break
        }
(9)        for i:=rowlow;i<=row;i++{
(10)            res = append(res,matrix[i][col])
        }
(11)        col--
(12)        if col < collow{
(13)            break
        }
(14)        for i := col;i>=collow;i--{
(15)            res = append(res,matrix[row][i])
        }
(16)        row--
(17)        if row < rowlow{
(18)            break
        }
(19)        for i:=row;i>=rowlow;i--{
(20)            res = append(res,matrix[i][collow])
        }
(21)        collow++
(22)        if collow > col{
(23)            break
        }
    }
    return res
}
  • (1) 使row,col赋值为最长的行和列,并且后来以这个为标准
  • (2) rowlow和collow为暂停位,变化以限制路线
  • (3) 存放结果
  • (4) 先遍历第一层
  • (5) 并且把第一层的数据全部放入
  • (6) 让rowlow++,因为此时已经遍历完成了一层
  • (7) 如果rowlow比row大,就说明已经遍历完所有的层数了
  • (8) 直接退出
  • (9) 遍历最后一列
  • (10) 把结果放入res中
  • (11) col-- 列数减少了一些
  • (12) 如果collow大于col就退出,因为此时已经遍历完所有的列数了
  • (13) 退出
  • (14) 遍历最后一行,
  • (15) 把元素放到最后一行
  • (16) row-- ,层数的界限减少了一层
  • (17) 如果rowlow比row大的话
  • (18) 可以直接退出了
  • (19) 遍历第一列
  • (20) 将结果放入其中
  • (21) collow++,表示已经遍历完这一列了
  • (22) 如果遍历过的列数比最大的列数要大
  • (23) 就退出了