美文网首页
54. Spiral Matrix 螺旋矩阵

54. Spiral Matrix 螺旋矩阵

作者: sarto | 来源:发表于2022-04-07 10:02 被阅读0次

题目

给定一个 m*n 的矩阵,以顺时针螺旋的形式返回所有的元素。

image.png

解析

走法是固定给出的,只需要确定终止条件即可。对于这个 m*n 的矩阵,我们先确定上下左右,四条边界,即top,bottom,left,right。螺旋在每一个边界上的方向都是固定的。首先,我们在 top 上移动,当移动到右边界时,判断bottom是否大于top,如果是,就调整方向沿着 right 移动,如果不是,说明已经终结。

伪代码

top = 0
bottom = m-1
left = 0
right = n-1
// top 移动
for {
for i=left;i<=right;i++
  rst+=matrix[top][i]
top--
if bottom < top
  return
for i=top;i<=bottom;i++
  rst+=matrix[i][right]
right--
if right < left
  return
for i=right;i>=left; i--
  rst+=matrix[bottom][i]
bottom--
if bottom < top
  return
for i= bottom;i>=top;i--
  rst+=matrix[left][i]
left--
if right<left
  return
}

代码

func spiralOrder(matrix [][]int) []int {
    nums := make([]int, len(matrix)*len(matrix[0]))
    cnt:=0
    top,bottom,left,right := 0,len(matrix)-1, 0, len(matrix[0])-1
    for {
        for i:=left;i<=right;i++ {
            nums[cnt] = matrix[top][i]
            cnt++
        }
        top++
        if bottom < top {
            break
        }
        
        for i:=top;i<=bottom;i++ {
            nums[cnt] = matrix[i][right]
            cnt++
        }
        right--
        if right < left {
            break
        }
        
        for i:=right;i>=left;i-- {
            nums[cnt]=matrix[bottom][i]
            cnt++
        }
        bottom--
        if bottom < top {
            break
        }
        
        for i:=bottom;i>=top;i-- {
            nums[cnt] = matrix[i][left]
            cnt++
        }
        left++
        if right < left {
            break
        }
    }
    return nums
}
image.png

相关文章

网友评论

      本文标题:54. Spiral Matrix 螺旋矩阵

      本文链接:https://www.haomeiwen.com/subject/tmejsrtx.html