54螺旋矩阵java
时间: 2025-05-10 18:31:22 浏览: 20
### Java 实现螺旋矩阵算法
以下是基于 LeetCode 第 54 题“螺旋矩阵”的解决方案,该问题要求按照顺时针螺旋顺序返回矩阵中的所有元素。此实现采用边界控制的方法来逐步缩小未访问区域。
#### 解决方案代码
```java
import java.util.ArrayList;
import java.util.List;
public class SpiralMatrix {
public List<Integer> spiralOrder(int[][] matrix) {
List<Integer> result = new ArrayList<>();
if (matrix == null || matrix.length == 0) return result;
int top = 0, bottom = matrix.length - 1;
int left = 0, right = matrix[0].length - 1;
while (top <= bottom && left <= right) {
// Traverse from Left to Right
for (int i = left; i <= right; i++) {
result.add(matrix[top][i]);
}
top++;
// Traverse Downwards
for (int i = top; i <= bottom; i++) {
result.add(matrix[i][right]);
}
right--;
if (top <= bottom) {
// Traverse from Right to Left
for (int i = right; i >= left; i--) {
result.add(matrix[bottom][i]);
}
bottom--;
}
if (left <= right) {
// Traverse Upwards
for (int i = bottom; i >= top; i--) {
result.add(matrix[i][left]);
}
left++;
}
}
return result;
}
public static void main(String[] args) {
SpiralMatrix solution = new SpiralMatrix();
int[][] input = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
System.out.println(solution.spiralOrder(input)); // Output: [1, 2, 3, 6, 9, 8, 7, 4, 5]
}
}
```
上述代码通过定义四个变量 `top`、`bottom`、`left` 和 `right` 来表示当前尚未处理的子矩阵范围,并依次沿四条边遍历矩阵[^1]。每次完成一条边的遍历时,相应方向上的边界会被收缩,从而逐渐逼近中心位置直到整个矩阵被完全遍历完毕[^5]。
---
### 关键点解析
1. **边界条件判断**
- 在每一轮循环之前都需要检查 `top <= bottom` 和 `left <= right` 是否成立,以防止重复遍历已经处理过的部分或者越界操作。
2. **时间复杂度分析**
- 假设输入矩阵大小为 \(m \times n\),那么每个元素只会被访问一次,因此总的时间复杂度为 \(O(m \cdot n)\)[^5]。
3. **空间复杂度优化**
- 结果存储在一个动态列表中 (`ArrayList`),其额外占用的空间与最终输出长度相同,即 \(O(\min(m,n))\)。
---
阅读全文
相关推荐















