Algorithms first
螺旋矩阵 · 交互式算法学习
按顺时针螺旋顺序返回矩阵元素。
#54 · 矩阵
螺旋矩阵
Spiral Matrix
matrix = [[1,2,3],[4,5,6],[7,8,9]]矩阵3 个关键状态
步骤 1读取上边界并下移 top。
top=110,0
20,1
30,2
41,0
51,1
61,2
72,0
82,1
92,2
推荐
收缩四条边界
时间
O(mn)空间 O(1)每走完一条边就把对应边界向内收缩。
1function spiralOrder(a) {2 let top = 0,3 bottom = a.length - 1,4 left = 0,5 right = a[0].length - 1,6 out = [];7 while (top <= bottom && left <= right) {8 for (let c = left; c <= right; c++) out.push(a[top][c]);9 top++;10 for (let r = top; r <= bottom; r++) out.push(a[r][right]);11 right--;12 if (top <= bottom)13 for (let c = right; c >= left; c--) out.push(a[bottom][c]);14 bottom--;15 if (left <= right)16 for (let r = bottom; r >= top; r--) out.push(a[r][left]);17 left++;18 }19 return out;20}多语言参考
来源 · CC BY-SA 4.0 ↗Java · C++ · Go
这是一组同题正确实现,独立于上方当前动画方法;不同语言可能采用另一种正确策略。
1class Solution {2 public List<Integer> spiralOrder(int[][] matrix) {3 int m = matrix.length, n = matrix[0].length;4 int[] dirs = {0, 1, 0, -1, 0};5 int i = 0, j = 0, k = 0;6 List<Integer> ans = new ArrayList<>();7 boolean[][] vis = new boolean[m][n];8 for (int h = m * n; h > 0; --h) {9 ans.add(matrix[i][j]);10 vis[i][j] = true;11 int x = i + dirs[k], y = j + dirs[k + 1];12 if (x < 0 || x >= m || y < 0 || y >= n || vis[x][y]) {13 k = (k + 1) % 4;14 }15 i += dirs[k];16 j += dirs[k + 1];17 }18 return ans;19 }20}交互式算法学习
从执行步骤真正理解 LeetCode 经典 150
本站整理 150 道高频算法面试题和 302 种解法。动画方法同步展示 JavaScript 与 Python;每题另提供 Java、C++ 与 Go 同题参考实现。
AlgoViz Lab
螺旋矩阵 · 解法对比
按顺时针螺旋顺序返回矩阵元素。
- 测试用例
matrix = [[1,2,3],[4,5,6],[7,8,9]]- 题目分类
- 矩阵
- 解法对比
- 2
方向模拟 + 访问标记
按右下左上方向移动,撞边或访问过就转向。
- 时间
O(mn)- 空间
O(mn)
收缩四条边界
每走完一条边就把对应边界向内收缩。
- 时间
O(mn)- 空间
O(1)