给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。
示例 1:
输入:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
输出: [1,2,3,6,9,8,7,4,5]
示例 2:
输入:
[
[1, 2, 3, 4],
[5, 6, 7, 8],
[9,10,11,12]
]
输出: [1,2,3,4,8,12,11,10,9,5,6,7]
答案:
1public List<Integer> spiralOrder(int[][] matrix) {
2 List<Integer> spiral = new ArrayList<>();
3 if (matrix == null || matrix.length == 0) return spiral;
4 int m = matrix.length, n = matrix[0].length;
5 int u = 0, d = m - 1, l = 0, r = n - 1, k = 0;
6 while (true) {
7 // up
8 for (int col = l; col <= r; col++) spiral.add(k++, matrix[u][col]);
9 if (++u > d) break;
10 // right
11 for (int row = u; row <= d; row++) spiral.add(k++, matrix[row][r]);
12 if (--r < l) break;
13 // down
14 for (int col = r; col >= l; col--) spiral.add(k++, matrix[d][col]);
15 if (--d < u) break;
16 // left
17 for (int row = d; row >= u; row--) spiral.add(k++, matrix[row][l]);
18 if (++l > r) break;
19 }
20 return spiral;
21}
解析:
分别遍历上边一行,右边一列,下边一行,左边一列,直到左等于右,或者上等于下终止循环。再来看一种写法
1public List<Integer> spiralOrder1(int[][] matrix) {
2 List<Integer> res = new LinkedList<>();
3 if (matrix == null || matrix.length == 0) return res;
4 int n = matrix.length, m = matrix[0].length;
5 int up = 0, down = n - 1;
6 int left = 0, right = m - 1;
7 int total = m * n;
8 while (res.size() < total) {
9 for (int j = left; j <= right && res.size() < total; j++)
10 res.add(matrix[up][j]);
11 for (int i = up + 1; i <= down - 1 && res.size() < total; i++)
12 res.add(matrix[i][right]);
13 for (int j = right; j >= left && res.size() < total; j--)
14 res.add(matrix[down][j]);
15 for (int i = down - 1; i >= up + 1 && res.size() < total; i--)
16 res.add(matrix[i][left]);
17 left++;
18 right--;
19 up++;
20 down--;
21 }
22 return res;
23}