LeetCode 54 螺旋矩阵

题目链接:

https://leetcode.cn/problems/spiral-matrix/

以下是使用Go语言实现外观数列问题的代码:

func spiralOrder(matrix [][]int) []int {
    // 定义结果数组
    var res []int
    // 定义上下左右边界
    top, bottom, left, right := 0, len(matrix)-1, 0, 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 {
            for i := right; i >= left; i-- {
                res = append(res, matrix[bottom][i])
            }
            // 下边界往上一行
            bottom--
        }
        // 如果左右边界没有相遇,从下到上遍历
        if left <= right {
            for i := bottom; i >= top; i-- {
                res = append(res, matrix[i][left])
            }
            // 左边界往右一列
            left++
        }
    }
    // 返回结果数组
    return res
}

执行用时:0 ms, 在所有 Go 提交中击败了100.00%的用户

内存消耗:1.9 MB, 在所有 Go 提交中击败了18.88%的用户

通过测试用例:23 / 23

这个问题可以使用模拟法解决,可以在遍历矩阵时按照顺时针的顺序遍历每一圈,具体步骤如下:

执行用时:0 ms, 在所有 Go 提交中击败了100.00%的用户

内存消耗:1.9 MB, 在所有 Go 提交中击败了18.88%的用户

通过测试用例:23 / 23

这个问题可以使用模拟法解决,可以在遍历矩阵时按照顺时针的顺序遍历每一圈,具体步骤如下:

执行用时:0 ms, 在所有 Go 提交中击败了100.00%的用户

内存消耗:1.9 MB, 在所有 Go 提交中击败了18.88%的用户

通过测试用例:23 / 23

这个问题可以使用模拟法解决,可以在遍历矩阵时按照顺时针的顺序遍历每一圈,具体步骤如下:

1.定义一个结果数组 res,初始为空。

2.定义上下左右四个边界,分别为 top, bottom, left, right,初始值分别为 0, m-1, 0, n-1,其中 m 和 n 分别为矩阵的行数和列数。

3.循环遍历直到上下左右四个边界相遇:

  • 从左到右遍历当前圈的上边界,将遍历的元素依次加入结果数组 res 中。
  • 将上边界往下移动一行,即 top++。
  • 从上到下遍历当前圈的右边界,将遍历的元素依次加入结果数组 res 中。
  • 将右边界往左移动一列,即 right--。
  • 如果上下边界没有相遇,从右到左遍历当前圈的下边界,将遍历的元素依次加入结果数组 res 中。
  • 将下边界往上移动一行,即 bottom--。
  • 如果左右边界没有相遇,从下到上遍历当前圈的左边界,将遍历的元素依次加入结果数组 res 中。
  • 将左边界往右移动一列,即 left++。

4.返回结果数组 res。

在这个算法中,我们使用了双层循环来遍历整个矩阵。外层循环用于控制遍历圈数,内层循环用于遍历当前圈的每一个元素。具体而言,我们使用四个变量 top, bottom, left, right 来表示当前圈的上下左右边界。在每一圈中,我们按照顺时针顺序遍历矩阵的四条边,并更新边界。在遍历每条边的过程中,我们将遍历到的元素加入结果数组 res 中。

需要注意的是,在从右到左和从下到上遍历边界时,我们需要判断左右边界和上下边界是否已经相遇,以避免重复遍历。

最后,我们返回结果数组 res 即可。

这个算法的时间复杂度是 O(mn),其中 m 和 n 分别是矩阵的行数和列数。空间复杂度也是 O(mn),即结果数组的长度。

原文链接:,转发请注明来源!