螺旋矩阵

LeetCode每日一题,54. Spiral Matrix

先看题目描述

6B6WJH.png

大意就是给定一个矩阵 matrix,让我们按照顺时针的顺序将其螺旋输出

算法和思路

按层模拟

可以将矩阵看成若干层,首先输出最外层的元素,然后输出内层的元素,就这样逐层的输出矩阵元素

具体到实现上,设矩阵有 m 行 n 列,矩阵的层数就为 (min{m,n} + 1) / 2,然后每层中有四个循环,分别是向右,向下,向左,向上的输出矩阵元素。注意特殊情况,当最内层只有一行或一列元素时,则不分为四次循环,而是直接一次性输出该行或该列元素

思路不难,但是实现细节比较多,容易出错,具体看下面代码吧

算法源码

按层模拟

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
class Solution {
public List<Integer> spiralOrder(int[][] matrix) {
List<Integer> ans = new ArrayList<>();
int m = matrix.length;
int n = matrix[0].length;
int round = (Math.min(m, n) + 1) / 2;
for (int i = 0; i < round; i++) {
if (i == n - i - 1) {
for (int x = i; x < m - i; x++) {
ans.add(matrix[x][i]);
}
} else if (i == m - i - 1) {
for (int y = i; y < n - i; y++) {
ans.add(matrix[i][y]);
}
} else {
for (int y = i; y < n - i - 1; y++) {
ans.add(matrix[i][y]);
}
for (int x = i; x < m - i - 1; x++) {
ans.add(matrix[x][n - i - 1]);
}
for (int y = n - i - 1; y > i; y--) {
ans.add(matrix[m - i - 1][y]);
}
for (int x = m - i - 1; x > i; x--) {
ans.add(matrix[x][i]);
}
}
}
return ans;
}
}