Java 剑指offer_面试题20_顺时针打印矩阵(思路在一步步分解之中)

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

例如:如果输入如下矩阵:

 1    2     3     4

 5    6     7     8

 9   10   11   12

13  14  15   16

则依次打印出数字:1、2、3、4、8、12、16、15、14、13、9、5、6、7、11、10。

思路如下:

Java 剑指offer_面试题20_顺时针打印矩阵(思路在一步步分解之中)

算法如下:

[java] view plain copy
  1. import java.util.ArrayList;  
  2. public class Solution {  
  3.     public ArrayList<Integer> printMatrix(int [][] matrix) {  
  4.         if (matrix == null)  
  5.             return null;  
  6.         ArrayList<Integer> result = new ArrayList<Integer>();  
  7.         int start = 0;  
  8.         while(matrix[0].length > start *2 && matrix.length > start *2){  
  9.             printMatrixInCircle(matrix,result,start);  
  10.             start++;  
  11.         }  
  12.         return  result;  
  13.     }  
  14.    
  15.     public static void printMatrixInCircle(int [][]matix,ArrayList<Integer>result,int start){  
  16.         int endX = matix[0].length - start -1;  
  17.         int endY = matix.length - start -1;  
  18.        //从左向右打印一行  
  19.         for(int i = start;i <=endX;i++){  
  20.             result.add(matix[start][i]);  
  21.         }  
  22.         //从上到下  
  23.         for(int i  = start+1; i <=endY;i++)  
  24.             result.add(matix[i][endX]);  
  25.         //从右到左  
  26.         if(start < endX &&start < endY)  
  27.             for(int i = endX -1;i>= start;i--)  
  28.                 result.add(matix[endY][i]);  
  29.         //从下到上  
  30.         if(start < endX && start < endY-1)  
  31.             for(int i = endY - 1;i >=start+1;i--)  
  32.                 result.add(matix[i][start]);  
  33.     }  
  34. }