题解 | #顺时针打印矩阵#
顺时针打印矩阵
http://www.nowcoder.com/practice/9b4c81a02cd34f76be2659fa0d54342a
思路:顺时针遍历,那么优先级:右->下->左->上,判断一个格子能不能走(1.没出界;2.没走过) 注意,不是每走一格判断下一步要怎么走,一旦确定的方向就一直朝着这个方向走,直到不能走为止,再去进行下一个方向; 如果每走一格判断一次下一步怎么走,那么就会出现由于右的优先级大于上,当格子要往上走时,会因为优先级而先向右走,从而漏掉一些格子; import java.util.ArrayList; public class Solution { public ArrayList<Integer> printMatrix(int [][] matrix) { ArrayList<Integer> result = new ArrayList<>(); int[][] isWalk = new int[matrix.length][matrix[0].length]; //判断二维数组是否为空 if((matrix==null || matrix.length==0) || (matrix.length==1 && matrix[0].length==0)){ return result; } // 标记是否走过 for(int i=0; i<isWalk.length; i++){ for(int j=0; j<isWalk[0].length; j++){ if(i==0&&j==0){ isWalk[i][j] = 1; //起点直接初始化为1 } else{ isWalk[i][j] = 0; //没走过置为0 } } } // 起点 int i=0; int j=0; //总共要走多少个格子 int sumWalk = matrix.length * matrix[0].length; int count = 1; //最开始已经占了1个格子 result.add(matrix[0][0]); while(count < sumWalk){ //能不能向右走(只要满足向右走的条件就一直走,一旦确定了方向就一直走) //先判断是否越界,如果越界就不用判断后面是不是走过这个格子了 //这样做可以防止数组越界(判断条件顺序不能颠倒) while(j+1<matrix[0].length && isWalk[i][j+1] == 0){ // 向右走 i = i; j = j + 1; count = count + 1; isWalk[i][j] = 1; result.add(matrix[i][j]); } //能不能向下走 while(i+1<matrix.length && isWalk[i+1][j] == 0){ i = i + 1; j = j; count = count + 1; isWalk[i][j] = 1; result.add(matrix[i][j]); } //能不能向左走 while(j-1>=0 && isWalk[i][j-1] == 0){ i = i; j = j - 1; count = count + 1; isWalk[i][j] = 1; result.add(matrix[i][j]); } //能不能向上走 while(i-1>=0 && isWalk[i-1][j] == 0){ i = i - 1; j = j; count = count + 1; isWalk[i][j] = 1; result.add(matrix[i][j]); } } return result; // for(i=0; i<result.size(); i++){ // if(i == 0){ // System.out.print('['); // } // else if(i == result.size() - 1){ // System.out.print(result.get(i)); // System.out.print(']'); // } // else{ // System.out.print(result.get(i)); // System.out.print(','); // } // } } }