题解 | #螺旋矩阵#

螺旋矩阵

http://www.nowcoder.com/practice/7edf70f2d29c4b599693dc3aaeea1d31

矩阵类题目关键点在于将问题进行拆分,这里就可以拆分成一层一层的矩阵,只要规定好每个矩阵如何螺旋收集外围数字就好了。

    public ArrayList<Integer> spiralOrder(int[][] matrix) {
        ArrayList<Integer> res = new ArrayList<>();
        if(matrix==null||matrix.length==0) return res;
        //左上角和右下角定下一个矩阵,每个矩阵的遍历规定好
        int[] leftTop = {0,0};
        int[] rightBottom = {matrix.length-1,matrix[0].length-1};
        while(leftTop[0]<=rightBottom[0]&&leftTop[1]<=rightBottom[1]){
            collectMatrix(res,leftTop,rightBottom,matrix);
            leftTop[0]+=1;
            leftTop[1]+=1;//右下角移动
            rightBottom[0]-=1;
            rightBottom[1]-=1;//左上角移动
        }
        return res;
    }    
    public void collectMatrix(ArrayList<Integer> res,int[] leftTop,int[] rightBottom,int[][] matrix){
        int[] cur = {leftTop[0],leftTop[1]};
        //一直向右走
        while(cur[1]<rightBottom[1]){
            res.add(matrix[cur[0]][cur[1]]);
            cur[1] += 1;
        }
        //处理单条的情况
        if(leftTop[0]==rightBottom[0]){
            res.add(matrix[cur[0]][cur[1]]);
            return;
        }
        //走不动了就向下
        while(cur[0]<rightBottom[0]){
            res.add(matrix[cur[0]][cur[1]]);
            cur[0] += 1;
        }
        //处理单条的情况
        if(leftTop[1]==rightBottom[1]){
            res.add(matrix[cur[0]][cur[1]]);
            return;
        }
        //走不动就像左
        while(cur[1]>leftTop[1]){
            res.add(matrix[cur[0]][cur[1]]);
            cur[1] -= 1;
        }        
        //走不动就向上
        while(cur[0]>leftTop[0]){
            res.add(matrix[cur[0]][cur[1]]);
            cur[0] -= 1;
        }
    }
全部评论

相关推荐

不愿透露姓名的神秘牛友
07-04 14:35
点赞 评论 收藏
分享
程序员饺子:正常 我沟通了200多个 15个要简历 面试2个 全投的成都的小厂。很多看我是27直接不会了😅
点赞 评论 收藏
分享
迟缓的斜杠青年巴比Q...:简历被投过的公司卖出去了,我前两天遇到过更离谱的,打电话来问我有没有意向报班学Java学习,服了,还拿我学校一个学长在他们那报班学了之后干了华为OD当招牌
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务