本题稍有难度,算是简单题中的难题,思考、实现过程花费将近两个小时,最后还是参考了官方答案,头大~
我的思路:
设置循环,从外层依次向内遍历
设置两个变量:height、width分别表示向上(下)、向左(右)遍历的次数
每一次循环:
向右遍历
height--
向下遍历
width--
向左遍历
height--
向上遍历
width--
然而始终没有想明白外层循环结束的时机….
更好的方法:
引入四个变量(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; } }
|