【剑指offer】顺时针打印矩阵
顺时针打印矩阵
http://www.nowcoder.com/questionTerminal/9b4c81a02cd34f76be2659fa0d54342a
该类题目需要从宏观的角度去考虑。
1.首先定义一个方法,给定左上角和右下角两个点,使用四个循环遍历输出矩阵外圈。注:需要考虑只包含一行和一列的情况。
2.确定矩阵的左上角和右下角,不断往里递进,调用步骤1中的方法打印当前矩阵的最外圈。
public static ArrayList<Integer> printMatrix(int [][] matrix) { ArrayList<Integer> list = new ArrayList<Integer>(); int row1 = 0; int col1 = 0; int row2 = matrix.length - 1; int col2 = matrix[0].length - 1; while (row1 <= row2 && col1 <= col2) { printLevel(list, matrix, row1++, col1++, row2--, col2--); } return list; } public static void printLevel(ArrayList<Integer> list, int[][] matrix, int row1, int col1, int row2, int col2) { if (row1 == row2) { for (int i = col1; i <= col2; i++) { list.add(matrix[row1][i]); } } else if (col1 == col2){ for (int i = row1; i <= row2; i++) { list.add(matrix[i][col1]); } } else { int curRow = row1; int curCol = col1; while (curCol < col2) { list.add(matrix[curRow][curCol++]); } while (curRow < row2) { list.add(matrix[curRow++][curCol]); } while (curCol > col1) { list.add(matrix[curRow][curCol--]); } while (curRow > row1) { list.add(matrix[curRow--][curCol]); } } }