顺时针打印矩阵——剑指offer

矩阵左上角标记为(tR,tC),右下角标标记为(dR,dC)。

先打印最外围一圈的矩阵,之后tR,tC加1,dR和dC减1,再打印子矩阵

import java.util.ArrayList;
public class Solution {
    public ArrayList<Integer> printMatrix(int [][] matrix) {
       if(matrix.length == 0){
           return null;
       } 
       ArrayList<Integer> res = new ArrayList<Integer>();
       int tR = 0;
       int tC = 0;
       int dR = matrix.length - 1;
       int dC = matrix[0].length - 1;
       while(tR <= dR && tC <= dC){
           PrintClockwise(matrix,tR++,tC++,dR--,dC--,res);
       }
        return res;
    }
    
   public static void PrintClockwise(int[][] m,int tR,int tC,int dR,int dC,ArrayList<Integer> res){
//       ArrayList<Integer> res = new ArrayList<Integer>();
       if(tR == dR) {//一行
           for(int i = tC; i <=dC; i++){//后来发现没有通过是因为没加等于号
               res.add(m[tR][i]);
           }
       }
       else if(tC == dC){//一列
           for(int i = tR; i <= dR; i++){
               res.add(m[i][tC]);
           }
       }
       else {
           int curC = tC;
           int curR = tR;
           while(curC != dC){
               res.add(m[tR][curC]);
               curC++;
           }
           while(curR != dR){
               res.add(m[curR][dC]);
               curR++;
           }
           while(curC != tC){
               res.add(m[dR][curC]);
               curC--;
           }
           while(curR != tR){
               res.add(m[curR][tC]);
               curR--;
           }
       }
       return;
   } 
}

 

posted @ 2017-05-17 01:04  dortmund  阅读(128)  评论(0)    收藏  举报