给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。

示例 1:

输入:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
输出: [1,2,3,6,9,8,7,4,5]
示例 2:

输入:
[
[1, 2, 3, 4],
[5, 6, 7, 8],
[9,10,11,12]
]
输出: [1,2,3,4,8,12,11,10,9,5,6,7]

按照正常的思维就是每次都边界了判断下转弯,但代码看起来很挫,答案里简化了写法,用一个数组来标识方向。

public List<Integer> spiralOrder(int[][] matrix) {
    List<Integer> list=new ArrayList();
    int r=matrix.length;
    if(r<=0) return list;
    int c=matrix[0].length;
    boolean[][] mark=new boolean[r][c];
    int op=0;
    int i=0;
    int j=0;
    for(int count=0;count<r*c;){
        list.add(matrix[i][j]);
        mark[i][j]=true;
        count++;
        int i0=i;
        int j0=j;
        if(op==0) j0++;
        else if(op==1) i0++;
        else if(op==2) j0--;
        else if(op==3) i0--;
        if(i0>=0 && i0<r && j0>=0 && j0<c && !mark[i0][j0]){
            i=i0;
            j=j0;
        }else{
            op++;
            if(op==4){
                op=0;
            }
            i0=i;
            j0=j;
            if(op==0) j0++;
            else if(op==1) i0++;
            else if(op==2) j0--;
            else if(op==3) i0--;
            i=i0;
            j=j0;
        }
    }
    return list;
}

还有一种,按层来遍历,每一层都是左上角开始,注意判断index=c-index-1或index=r-index-1的重复情况

public List<Integer> spiralOrder(int[][] matrix) {
    List<Integer> list=new ArrayList();
    int r=matrix.length;
    if(r<=0) return list;
    int c=matrix[0].length;
    int max=Math.min((r+1)/2,(c+1)/2);
    for(int index=0;index<max;index++){
        for(int j=index;j<=c-index-1;j++) list.add(matrix[index][j]);
        for(int i=index+1;i<=r-index-1;i++) list.add(matrix[i][c-index-1]);
        for(int j=c-index-2;j>index && r-index-1>index;j--) list.add(matrix[r-index-1][j]);
        for(int i=r-index-1;i>index && c-index-1>index;i--) list.add(matrix[i][index]);
    }
    return list;
}

程浩
21 声望2 粉丝

下一篇 »
55. 跳跃游戏