题目描述(中等难度)

54. Spiral Matrix - 图1

从第一个位置开始,螺旋状遍历二维矩阵。

54. Spiral Matrix - 图2

解法一

可以理解成贪吃蛇,从第一个位置开始沿着边界走,遇到边界就转换方向接着走,直到走完所有位置。

  1. /*
  2. * direction 0 代表向右, 1 代表向下, 2 代表向左, 3 代表向上
  3. */
  4. public List<Integer> spiralOrder(int[][] matrix) {
  5. List<Integer> ans = new ArrayList<>();
  6. if(matrix.length == 0){
  7. return ans;
  8. }
  9. int start_x = 0,
  10. start_y = 0,
  11. direction = 0,
  12. top_border = -1, //上边界
  13. right_border = matrix[0].length, //右边界
  14. bottom_border = matrix.length, //下边界
  15. left_border = -1; //左边界
  16. while(true){
  17. //全部遍历完结束
  18. if (ans.size() == matrix.length * matrix[0].length) {
  19. return ans;
  20. }
  21. //注意 y 方向写在前边,x 方向写在后边
  22. ans.add(matrix[start_y][start_x]);
  23. switch (direction) {
  24. //当前向右
  25. case 0:
  26. //继续向右是否到达边界
  27. //到达边界就改变方向,并且更新上边界
  28. if (start_x + 1 == right_border) {
  29. direction = 1;
  30. start_y += 1;
  31. top_border += 1;
  32. } else {
  33. start_x += 1;
  34. }
  35. break;
  36. //当前向下
  37. case 1:
  38. //继续向下是否到达边界
  39. //到达边界就改变方向,并且更新右边界
  40. if (start_y + 1 == bottom_border) {
  41. direction = 2;
  42. start_x -= 1;
  43. right_border -= 1;
  44. } else {
  45. start_y += 1;
  46. }
  47. break;
  48. case 2:
  49. if (start_x - 1 == left_border) {
  50. direction = 3;
  51. start_y -= 1;
  52. bottom_border -= 1;
  53. } else {
  54. start_x -= 1;
  55. }
  56. break;
  57. case 3:
  58. if (start_y - 1 == top_border) {
  59. direction = 0;
  60. start_x += 1;
  61. left_border += 1;
  62. } else {
  63. start_y -= 1;
  64. }
  65. break;
  66. }
  67. }
  68. }

时间复杂度:O(m * n),m 和 n 是数组的长宽。

空间复杂度:O(1)。

在 leetcode 的 solution 和 discuss 看了下,基本就是这个思路了,只是实现上有些不同,怎么用来标记是否走过,当前方向,怎么遍历,实现有些不同,但本质上是一样的。就是充分理解题意,然后模仿遍历的过程。

windliang wechat

添加好友一起进步~

如果觉得有帮助的话,可以点击 这里 给一个 star 哦 ^^

如果想系统的学习数据结构和算法,强烈推荐一个我之前学过的课程,可以点击 这里 查看详情