题目

力扣题目链接 ,本题与 剑指 Offer 29. 顺时针打印矩阵 相同。

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

示例 1:
image.png

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

示例 2:
image.png

  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]

提示:

  • m == matrix.length
  • n == matrix[i].length
  • 1 <= m, n <= 10
  • -100 <= matrix[i][j] <= 100

思路

总体上来说,本题与 54. 螺旋矩阵 几乎是一样的,唯一一个区别在于:

  • 54. 螺旋矩阵 是给定一个 n ,矩阵中的数值区间为 [1, n]
  • 本题的矩阵中数字没有规律

不过不影响,同样可以使用四边界法解决。

答案

Java

  1. class Solution {
  2. public List<Integer> spiralOrder(int[][] matrix) {
  3. // 特例
  4. if (matrix.length == 0 || matrix[0].length == 0) {
  5. return new ArrayList<Integer>(0);
  6. }
  7. // 获取矩阵行列数
  8. int row = matrix.length, column = matrix[0].length;
  9. // 申请固定空间大小的数组作为答案的容器
  10. List<Integer> list = new ArrayList<>(row * column);
  11. // 设定四边界
  12. int top = 0, bottom = row - 1, left = 0, right = column - 1;
  13. // 计算循环次数
  14. int count = row * column;
  15. while (count >= 1) {
  16. // 从左界到右界(从矩阵左上角填到右上角)
  17. for (int i = left; i <= right && count >= 1; i++) {
  18. list.add(matrix[top][i]);
  19. count--;
  20. }
  21. // 上界向下收缩1格, 因为矩阵的上侧已经处理完成
  22. top++;
  23. // 从上界到下界(从矩阵右上角填到右下角)
  24. for (int i = top; i <= bottom && count >= 1; i++) {
  25. list.add(matrix[i][right]);
  26. count--;
  27. }
  28. // 右界向左移动1格, 因为矩阵的右侧已经处理完成
  29. right--;
  30. // 从右界到左界(从矩阵右下角填到左下角)
  31. for (int i = right; i >= left && count >= 1; i--) {
  32. list.add(matrix[bottom][i]);
  33. count--;
  34. }
  35. // 下界向上移动1格, 因为矩阵的下侧已经处理完成
  36. bottom--;
  37. // 从下界到上界(从矩阵左下角填到左上角)
  38. for (int i = bottom; i >= top && count >= 1; i--) {
  39. list.add(matrix[i][left]);
  40. count--;
  41. }
  42. // 左界向右移动1格, 因为矩阵的左侧已经处理完成
  43. left++;
  44. }
  45. return list;
  46. }
  47. }

REF

https://leetcode-cn.com/problems/spiral-matrix/