1. 顺时针打印矩阵

image-20200622155851958

本题稍有难度,算是简单题中的难题,思考、实现过程花费将近两个小时,最后还是参考了官方答案,头大~

我的思路:

设置循环,从外层依次向内遍历

设置两个变量:height、width分别表示向上(下)、向左(右)遍历的次数

每一次循环:

  • 向右遍历

    height--

  • 向下遍历

    width--

  • 向左遍历

    height--

  • 向上遍历

    width--

然而始终没有想明白外层循环结束的时机….

更好的方法:
image-20200622160616550

引入四个变量(top、left、bottom、right)来标识边界更加直观!

每次循环结束,整个边界向内收缩一圈:

  • left++;
  • right--;
  • top++;
  • bottom--;
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
class Solution {
public int[] spiralOrder(int[][] matrix) {
if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {
return new int[0];
}
int rows = matrix.length, columns = matrix[0].length;
int[] order = new int[rows * columns];
int index = 0;
int left = 0, right = columns - 1, top = 0, bottom = rows - 1;
while (left <= right && top <= bottom) {
for (int column = left; column <= right; column++) {
order[index++] = matrix[top][column];
}
for (int row = top + 1; row <= bottom; row++) {
order[index++] = matrix[row][right];
}
if (left < right && top < bottom) {
for (int column = right - 1; column > left; column--) {
order[index++] = matrix[bottom][column];
}
for (int row = bottom; row > top; row--) {
order[index++] = matrix[row][left];
}
}
left++;
right--;
top++;
bottom--;
}
return order;
}
}