ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2020-06-06 12:55:12  阅读:288  来源: 互联网

标签:count 面试题 顺时针 matrix record int 29 重合 ++


image-20200606122713224

模拟+记录路径

思路

  • 模拟矩阵打印的路径,同时用数组record记录当前元素是否被访问过
  • 注意边界处理,否则易越界。

代码

    /**
     * 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;
    }

优化

  • 设置四个边界值,动态更新。空间复杂度O(mn)->O(1)

  • 若有边界重合,则打印结束。

  • 原文详细题解

代码

/**
  * 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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有