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

    示例 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.length == 0) return new int[0];
    4. int l = 0, r = matrix[0].length - 1, t = 0, b = matrix.length - 1, x = 0;
    5. int[] res = new int[(r + 1) * (b + 1)];
    6. while(true) {
    7. for(int i = l; i <= r; i++) res[x++] = matrix[t][i]; // left to right.
    8. if(++t > b) break;
    9. for(int i = t; i <= b; i++) res[x++] = matrix[i][r]; // top to bottom.
    10. if(l > --r) break;
    11. for(int i = r; i >= l; i--) res[x++] = matrix[b][i]; // right to left.
    12. if(t > --b) break;
    13. for(int i = b; i >= t; i--) res[x++] = matrix[i][l]; // bottom to top.
    14. if(++l > r) break;
    15. }
    16. return res;
    17. }
    18. }
    19. //自己写的
    20. class Solution {
    21. public int[] spiralOrder(int[][] matrix) {
    22. int m = matrix.length;
    23. if(m == 0){
    24. return new int[0];
    25. }
    26. int n = matrix[0].length;
    27. int offset = 0;
    28. int row = 0, col = 0;
    29. int count = 0;
    30. int [] res = new int[m * n];
    31. while(true){
    32. for(; col < n - offset; col++){
    33. res[count++] = matrix[row][col];
    34. }
    35. col--;
    36. row++;
    37. if(count == m*n)
    38. break;
    39. for(; row < m - offset; row++){
    40. res[count++] = matrix[row][col];
    41. }
    42. row--;
    43. col--;
    44. if(count == m*n)
    45. break;
    46. for(; col >= offset; col--){
    47. res[count++] = matrix[row][col];
    48. }
    49. col++;
    50. row--;
    51. if(count == m*n)
    52. break;
    53. for(; row > offset; row--){
    54. res[count++] = matrix[row][col];
    55. }
    56. row++;
    57. col++;
    58. if(count == m*n)
    59. break;
    60. offset++;
    61. }
    62. return res;
    63. }
    64. }