题目描述

给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
No.54 螺旋矩阵 - 图1

  1. 输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
  2. 输出:[1,2,3,6,9,8,7,4,5]

No.54 螺旋矩阵 - 图2

  1. 输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
  2. 输出:[1,2,3,4,8,12,11,10,9,5,6,7]

思路

  1. 设定四个边界;
  2. 总是按照右下左上的顺序遍历,每次改变一次方向的时候,改变对应border的值;
  3. 当leftBorder > rightBorder或者topBorder > bottomBorder的时候,越界了,说明要停止了。

具体逻辑参考代码

代码

  1. class Solution {
  2. public List<Integer> spiralOrder(int[][] matrix) {
  3. List<Integer> result = new ArrayList<>();
  4. int leftBorder = 0;
  5. int rightBorder = matrix[0].length - 1;
  6. int topBorder = 0;
  7. int bottomBorder = matrix.length - 1;
  8. while (true) {
  9. // 从左往右遍历,变化的是列,列的初始值为左border
  10. for (int col = leftBorder; col <= rightBorder; col++) {
  11. // 添加的时候,topBorder是不变的,变化的是列。
  12. result.add(matrix[topBorder][col]);
  13. }
  14. // 遍历结束后,topBorder要+1,相当于最上边一行不要了。
  15. if (++topBorder > bottomBorder) {
  16. break;
  17. }
  18. // 下面逻辑同理,只需要注意变化的是行还是列
  19. for (int row = topBorder; row <= bottomBorder; row++) {
  20. result.add(matrix[row][rightBorder]);
  21. }
  22. if (--rightBorder < leftBorder) {
  23. break;
  24. }
  25. for (int col = rightBorder; col >= leftBorder; col--) {
  26. result.add(matrix[bottomBorder][col]);
  27. }
  28. if (--bottomBorder < topBorder) {
  29. break;
  30. }
  31. for (int row = bottomBorder; row >= topBorder; row--) {
  32. result.add(matrix[row][leftBorder]);
  33. }
  34. if (++leftBorder > rightBorder) {
  35. break;
  36. }
  37. }
  38. return result;
  39. }
  40. }