//螺旋上下左右过程中,端点是否包括,头尾都要包含,否则当只有一行的情况,就会漏掉元素。 考虑起始点开始螺旋只有一行或者一列的时候,要进行去重。
public ArrayList<Integer> spiralOrder(int[][] matrix) { ArrayList<Integer> res = new ArrayList<>(); //matrix.length==0判断如果是一维矩阵,那么matrix[0]就会报错。 if(matrix.length==0) return res; int col = matrix[0].length-1; int row = matrix.length-1; //起始点是col/2和row/2的最小值 for(int i=0;i<=Math.min(col/2,row/2);i++){ ArrayList<Integer> list = getList(i,matrix,col,row); res.addAll(list); } return res; } //从某个点开始的螺旋结果 private ArrayList<Integer> getList(int i, int[][] matrix,int col,int row) { //(i,i) (i,col-i) (row-i,col-i) (row-i,i) ArrayList<Integer> list =new ArrayList<>(); //对于特殊情况的判断 只有一个点 if(row-i==i && col-i==i){ list.add(matrix[i][i]); return list; } for (int c=i;c<=col-i;c++){ list.add(matrix[i][c]); } for (int r=i+1;r<=row-i;r++){ list.add(matrix[r][col-i]); } //此时只有一行 if(row-i!=i){//去重 for(int c=col-i-1;c>=i;c--){ list.add(matrix[row-i][c]); } } //此时只有一列 if(col-i!=i) {//去重 for (int r = row - i-1; r > i; r--) { list.add(matrix[r][i]); } } return list; }