问题描述

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。

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

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

问题分析

矩阵的顺时针打印,就是按照正常的流程顺序:从左到右,从上到下,从右到左,从下到上四个方向来打印;
对于最后一圈的打印可能存在比较特殊的情况:
只有一行、只有一列

代码实现

  1. class Solution {
  2. public int[] spiralOrder(int[][] matrix) {
  3. if(matrix == null || matrix.length == 0 || matrix[0].length == 0){
  4. return new int[0];
  5. }
  6. int rows = matrix.length;
  7. int cloum = matrix[0].length;
  8. int total = rows * cloum;
  9. int[] result = new int[total];
  10. int start = 0;
  11. int index = 0;
  12. while(rows > start*2 && cloum > start*2){
  13. int endX = cloum - start - 1;
  14. int endY = rows - start - 1;
  15. //从左到右打印
  16. for(int i=start; i <= endX; i++){
  17. result[index++] = matrix[start][i];
  18. }
  19. //从上到下打印,可能存在单列的问题
  20. if(start < endY){
  21. for(int j=start+1; j<= endY; j++){
  22. result[index++] = matrix[j][endX];
  23. }
  24. }
  25. //从右往左打印,可能存在单行的可能性
  26. if(start < endX && start< endY){
  27. for(int k=endX-1; k >= start; k--){
  28. result[index++] = matrix[endY][k];
  29. }
  30. }
  31. //从下往上打印,需要注意的是可能存在单列的可能性
  32. if(start < endX && start < endY){
  33. for(int s=endY-1; s > start; s--){
  34. result[index++] = matrix[s][start];
  35. }
  36. }
  37. start++;
  38. }
  39. return result;
  40. }
  41. }