LeetCode 54. 螺旋矩阵

题目描述

🔥 54. 螺旋矩阵

image-20230304214740996

image-20230304214747567

思路分析

  1. 定义四个边界:topbottomleftright,分别表示当前可遍历的矩阵的上下左右边界。
  2. 使用一个循环,按照顺时针的顺序遍历矩阵:
    • 从左到右遍历 top 行,然后 top 边界下移。
    • 从上到下遍历 right 列,然后 right 边界左移。
    • 从右到左遍历 bottom 行(如果 top 仍然小于等于 bottom),然后 bottom 边界上移。
    • 从下到上遍历 left 列(如果 left 仍然小于等于 right),然后 left 边界右移。
  3. 重复以上步骤,直到所有元素都被遍历。

参考代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
func spiralOrder(matrix [][]int) []int {
	if len(matrix) == 0 {
		return []int{}
	}

	var res []int
	top, bottom := 0, len(matrix)-1
	left, right := 0, len(matrix[0])-1

	for top <= bottom && left <= right {
		// 从左到右遍历 top 行
		for i := left; i <= right; i++ {
			res = append(res, matrix[top][i])
		}
		top++

		// 从上到下遍历 right 列
		for i := top; i <= bottom; i++ {
			res = append(res, matrix[i][right])
		}
		right--

		// 从右到左遍历 bottom 行
		if top <= bottom {
			for i := right; i >= left; i-- {
				res = append(res, matrix[bottom][i])
			}
			bottom--
		}

		// 从下到上遍历 left 列
		if left <= right {
			for i := bottom; i >= top; i-- {
				res = append(res, matrix[i][left])
			}
			left++
		}
	}

	return res
}
  • 时间复杂度:O (m * n),其中 m 是矩阵的行数,n 是矩阵的列数。我们遍历了每个元素一次。
  • 空间复杂度:O (1),不考虑输出结果的空间,使用了常数级别的额外空间。

🍏 点击查看 Java 题解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
class Solution {
    public List<Integer> spiralOrder(int[][] matrix) {
        List<Integer> res = new ArrayList<>();
        int m = matrix.length;
        int n = matrix[0].length;
        int rowBegin = 0, rowEnd = m - 1;
        int colBegin = 0, colEnd = n - 1;

        while (rowBegin <= rowEnd && colBegin <= colEnd) {
            // 向右
            for (int j = colBegin; j <= colEnd; j++) {
                res.add(matrix[rowBegin][j]);
            }
            rowBegin++;

            // 向下
            for (int i = rowBegin; i <= rowEnd; i++) {
                res.add(matrix[i][colEnd]);
            }
            colEnd--;

            // 向左(检查是否需要继续)
            if (rowBegin <= rowEnd) {
                for (int j = colEnd; j >= colBegin; j--) {
                    res.add(matrix[rowEnd][j]);
                }
                rowEnd--;
            }

            // 向上(检查是否需要继续)
            if (colBegin <= colEnd) {
                for (int i = rowEnd; i >= rowBegin; i--) {
                    res.add(matrix[i][colBegin]);
                }
                colBegin++;
            }
        }
        return res;
    }
}
本文作者:
本文链接: https://hgnulb.github.io/blog/2022/76110162
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处!