其他分享
首页 > 其他分享> > 面试题29.顺时针打印矩阵

面试题29.顺时针打印矩阵

作者:互联网

image-20200606122713224

模拟+记录路径

思路

代码

    /**
     * 2ms O(mn)
     * 空间复杂度 O(mn)
     */
    public static int[] spiralOrder(int[][] matrix) {
        if(matrix==null||matrix.length==0) return new int[0];
        int r = matrix.length,count=0,c = matrix[0].length,sum=r*c;
        int[] ans=new int[sum];
        int[][] record= new int[r][c];
        int i=0,j=0;
        while(count<sum){
            while(j<c&&record[i][j]==0){
                ans[count]=matrix[i][j];
                record[i][j]=1;
                count++;
                j++;
            }
            j--;
            i++;

            while(i<r&&record[i][j]==0){
                ans[count]=matrix[i][j];
                record[i][j]=1;
                count++;
                i++;
            }
            i--;
            j--;

            while(j>=0&&record[i][j]==0){
                ans[count]=matrix[i][j];
                record[i][j]=1;
                count++;
                j--;
            }
            j++;
            i--;

            while(i>=0&&record[i][j]==0){
                ans[count]=matrix[i][j];
                record[i][j]=1;
                count++;
                i--;
            }
            i++;
            j++;
        }
        return ans;
    }

优化

代码

/**
  * 1ms  O(mn)
  * 空间复杂度 O(1)
  */
public static int[] spiralOrder2(int[][] matrix){
        if(matrix.length == 0) return new int[0];
        //定义  l r t b 四个边界
        int l = 0, r = matrix[0].length - 1, t = 0, b = matrix.length - 1, x = 0;
        int[] res=new int[(r+1)*(b+1)];
        while(true){//若有边界重合 打印结束
            for(int i=1;i<=r;i++) res[x++]=matrix[t][i];//left->right
            if(++t>b) break;//判断上下边界是否重合 未重合,则top->bottom
            for(int i=1;i<=b;i++) res[x++]=matrix[i][r];//top->bottom
            if(l>--r) break;//判断右左边界是否重合 未重合,则right->left
            for(int i=r;i>=l;i--) res[x++]=matrix[b][i];//right->left
            if(t>--b) break;//判断下上边界是否重合 未重合,则bottom->top
            for(int i=b;i>=t;i--) res[x++]=matrix[i][l];//bottom->top
            if(++l>r) break;//判断左右边界是否重合 未重合,则left->right
        }
        return res;
}

参考链接

krahets:模拟、设定边界、清晰图解

标签:count,面试题,顺时针,matrix,record,int,29,重合,++
来源: https://www.cnblogs.com/yh-simon/p/13054293.html