顺时针打印矩阵
顺时针打印矩阵
http://www.nowcoder.com/practice/9b4c81a02cd34f76be2659fa0d54342a
第一个直觉是递归,先打印外层的一圈,然后像剥洋葱一样,打印内部的一圈,直到最后递归打印到最核心。
试着实现了一下,有小坑:
import java.util.*; public class Solution { public ArrayList<Integer> printMatrix(int [][] matrix) { ArrayList<Integer> ret = new ArrayList<>(); if (matrix == null || matrix.length == 0 || matrix[0].length == 0) { return ret; } doPrint(matrix, 0, matrix[0].length - 1, matrix.length - 1, 0, ret); return ret; } // top: 顶层行号, bottom: 底层行号 // left: 左侧列号,right:右侧列号 private void doPrint(int[][] matrix, int top, int right, int bottom, int left, List<Integer> ret) { if (top > bottom || left > right) { return; // 递归终止条件 } for (int i = left; i <= right; ++i) { ret.add(matrix[top][i]); } for (int i = top + 1; i <= bottom; ++i) { ret.add(matrix[i][right]); } if (bottom > top) { // 如果只有一行,那就不用再重复加一遍了 for(int i = right - 1; i >= left; --i) { ret.add(matrix[bottom][i]); } } if (right > left) { // 如果只有一列,也不用重复加一遍了 for (int i = bottom - 1; i > top; --i) { ret.add(matrix[i][left]); } } doPrint(matrix, ++top, --right, --bottom, ++left, ret); } }
实现的时候的2个坑:
- 没加递归终止条件,这是自己的问题,后来没想明白,把终止条件设置为
top > bottom && left > right
,这时有些情形已经越界了。 - 递归辅助函数中,如果只有一行或者只有一列的情形,此时不需要再重复打印,需要单独处理。
题解里面每次都打印第一行,然后将矩阵逆时针旋转的解法也很巧妙。