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) 就退出了