【忍者算法】从生活场景到螺旋矩阵:探索矩阵的螺旋遍历|LeetCode 54 螺旋矩阵
从生活场景到螺旋矩阵:探索矩阵的螺旋遍历生活中的螺旋
你有没有注意过,生活中螺旋的形状随处可见?比如蜗牛壳的螺旋纹路、向日葵中心的螺旋排列、甚至是停车场的螺旋坡道。这种由外向内(或由内向外)的螺旋路径,不仅是大自然的奇妙设计,也启发了我们解决一些编程问题。
问题描述
LeetCode第54题"螺旋矩阵"是这样描述的:给你一个 m x n 的矩阵,请按照顺时针螺旋顺序,返回矩阵中的所有元素。
例如:
输入:matrix = [,
,
]
输出:想象你在逛一个方形的购物中心,从正门开始,按顺时针方向走完每条走廊,最终到达中心的休息区。这就是一个完美的螺旋路径!
最直观的解法:模拟螺旋过程
就像我们在购物中心逛街一样,最直观的方法是:按照右、下、左、上的顺序,一步步"走"过矩阵的每个元素。
让我们用一个简单的3×3矩阵来理解:
1 2 3 →→→ 第一步:向右走到底
4 5 6 ↓ 第二步:向下走到底
7 8 9 ←←← 第三步:向左走到底
↑ 第四步:向上走到顶优化解法:边界收缩
仔细观察,我们其实是在不断缩小遍历的范围。就像削苹果皮,从外面一圈圈向内削去。我们可以维护四个边界(上、下、左、右),每走完一个方向就收缩对应的边界。
边界收缩的原理
想象你在玩一个迷宫游戏:
[*]一开始,你可以在整个迷宫中移动
[*]走完一条路径后,那条路就会消失(边界收缩)
[*]在剩余的空间中继续移动
[*]直到走完所有路径
示例运行
用一个3×3的例子来说明:
初始状态:
上边界(top)=0, 下边界(bottom)=2
左边界(left)=0, 右边界(right)=2
第一圈:
1. 向右:(0,0)->(0,2)
上边界+1
2. 向下:(0,2)->(2,2)
右边界-1
3. 向左:(2,2)->(2,0)
下边界-1
4. 向上:(2,0)->(1,0)
左边界+1
第二圈:
只剩中间的5,直接添加Java代码实现
public List spiralOrder(int[][] matrix) { List result = new ArrayList(); if (matrix == null || matrix.length == 0) { return result; } // 定义四个边界 int top = 0; int bottom = matrix.length - 1; int left = 0; int right = matrix.length - 1; while (top
页:
[1]