题目链接

题目描述

按顺时针的方向,从外到里打印矩阵的值。下图的矩阵打印结果为:1, 2, 3, 4, 8, 12, 16, 15, 14, 13, 9, 5, 6, 7, 11, 10

jz29-顺时针打印矩阵 - 图1

解题思路

一层一层从外到里打印,观察可知每一层打印都有相同的处理步骤,唯一不同的是上下左右的边界不同了。因此使用四个变量 r1, r2, c1, c2 分别存储上下左右边界值,从而定义当前最外层。打印当前最外层的顺序:从左到右打印最上一行->从上到下打印最右一行->从右到左打印最下一行->从下到上打印最左一行。应当注意只有在 r1 != r2 时才打印最下一行,也就是在当前最外层的行数大于 1 时才打印最下一行,这是因为当前最外层只有一行时,继续打印最下一行,会导致重复打印。打印最左一行也要做同样处理。

jz29-顺时针打印矩阵 - 图2

  1. import java.util.ArrayList;
  2. public class Solution {
  3. public ArrayList<Integer> printMatrix(int [][] matrix) {
  4. ArrayList<Integer> res = new ArrayList<Integer>();
  5. int top=0,bottom=matrix.length-1;
  6. int left=0,right=matrix[0].length-1;
  7. if(matrix.length == 0 || matrix[0].length==0){
  8. return res;
  9. }
  10. // 输入数组只有一行
  11. if(matrix.length == 1){
  12. for(int i=left;i<=right;i++){
  13. res.add(matrix[top][i]);
  14. }
  15. return res;
  16. }
  17. // 输入数组只有一列
  18. if(matrix[0].length == 1){
  19. for(int i=top;i<=bottom;i++){
  20. res.add(matrix[i][left]);
  21. }
  22. return res;
  23. }
  24. while(top<=bottom&&left<=right){
  25. // top
  26. for(int i=left;i<=right;i++){
  27. res.add(matrix[top][i]);
  28. }
  29. top++;
  30. // right
  31. for(int i=top;i<=bottom;i++){
  32. res.add(matrix[i][right]);
  33. }
  34. right--;
  35. //bottom
  36. for(int i=right;i>=left;i--){
  37. res.add(matrix[bottom][i]);
  38. }
  39. bottom--;
  40. //left
  41. for(int i=bottom;i>=top;i--){
  42. res.add(matrix[i][left]);
  43. }
  44. left++;
  45. // 当top==bottom时,意味着循环到了最中间的一个行
  46. // 而不是只有一行,如果传入的数组本身只有一行的话,在while循环外就会被过滤掉
  47. if(top==bottom){
  48. for(int i=left;i<=right;i++){
  49. res.add(matrix[top][i]);
  50. }
  51. break;
  52. }
  53. // 道理同上
  54. if(left==right){
  55. for(int i=top;i<=bottom;i++){
  56. res.add(matrix[i][left]);
  57. }
  58. break;
  59. }
  60. }
  61. return res;
  62. }
  63. }

代码分析

注意代码中注释中书写