//螺旋上下左右过程中,端点是否包括,头尾都要包含,否则当只有一行的情况,就会漏掉元素。 考虑起始点开始螺旋只有一行或者一列的时候,要进行去重。
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;
}
京公网安备 11010502036488号