剑指offer——顺时针打印矩阵
题目链接:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 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.
解题思路:看的左神的想法做的,剥圈打印,一圈一圈的打印。
1 import java.util.ArrayList; 2 public class Solution { 3 public ArrayList<Integer> printMatrix(int [][] matrix) { 4 ArrayList arrlist = new ArrayList<>(); 5 6 int tR = 0;//左上角行 7 int tC = 0;//左上角的列 8 int dR = matrix.length - 1;//右下角的行 9 int dC = matrix[0].length - 1;//右下角的列 10 while (tR <= dR && tC <= dC) { 11 printEdge(matrix, tR++, tC++, dR--, dC--,arrlist); 12 } 13 return arrlist; 14 } 15 16 public static void printEdge(int[][] m, int tR, int tC, int dR, int dC,ArrayList<Integer> arrlist) { 17 if (tR == dR) {//先判断是否只是一横行 如果是 打印该横行的列(通常用于内圈) 18 for (int i = tC; i <= dC; i++) { 19 arrlist.add(m[tR][i]); 20 } 21 } else if (tC == dC) {//再判断是否只是一竖列 如果是 打印该横行的列(通常用于内圈 22 for (int i = tR; i <= dR; i++) { 23 arrlist.add(m[i][tC]); 24 } 25 } else { 26 int curC = tC;//用2个变量储存 用于判断当前位置 27 int curR = tR; 28 while (curC != dC) {//当前位置未到达当前行的最右列 --》往右去 29 arrlist.add(m[tR][curC]); 30 curC++; 31 } 32 while (curR != dR) {//当前位置未到达当前列的最底行 --》往下去 33 arrlist.add(m[curR][dC]); 34 curR++; 35 } 36 while (curC != tC) {//当前位置未到达当前行的最左列 --》往左去 37 arrlist.add(m[dR][curC]); 38 curC--; 39 } 40 while (curR != tR) { 41 arrlist.add(m[curR][tC]); 42 curR--; 43 } 44 } 45 } 46 47 }