LeetCodeNo_54

这个题目是个旋转矩阵的问题,就是按照螺旋形状遍历整个矩阵。
看到这个题目我第一反应还是递归(原谅我最近递归上瘾),因为整个遍历过程都是对矩阵进行相似的操作,我们只需要保存下来每次遍历的初始位置即可,并且结合已经处理过行数和列数就可以控制螺旋遍历。因此问题的核心就是寻找更新遍历初始位置的方法。经过自己手动演算了几次后可以很快的找到。
行的更新需要用到已处理的列的数目,而列的更新需要用到已处理的行的数目,具体的更新方法在代码里面详细介绍。值得注意的就是我的代码当中设置一个boolean变量来控制行列交替执行。

public List<Integer> spiralOrder(int[][]matrix){
        List<Integer> res=new ArrayList<>();
        if(matrix.length==0)//空矩阵则直接返回一个空的列表
            return res;
        boolean H=false;//控制按行遍历还是按列遍历,初始按行
        int start_L=0,start_H=0, row=0, col=0;//按行遍历起始点,按列遍历出发点,已遍历行数,已遍历列数
        while(res.size()<matrix.length*matrix[0].length){
            if(H){//按行遍历
                int start=start_L;
                if(row%2==0){//从左到右遍历
                    for(int i=0;i<matrix.length-col;i++){
                        res.add(matrix[start_H+i][start]);
                    }
                }else {//从右向左
                    for(int i=0;i<matrix.length-col;i++){
                        res.add(matrix[start_H-i][start]);
                    }
                }
                if(row%2==0) {
                    start_H = matrix.length - col+row/2;//从左到右遍历完后下一次行遍历的初始位置
                    start_L-=1;//用到的列数
                }else {
                    start_H =(col)/2;
                    start_L+=1;
                }
                H=false;//交替
                row++;
            }else{
                int start=start_H;
                if(col%2==0){
                    for(int i=0;i<matrix[0].length-row;i++){
                        res.add(matrix[start][start_L+i]);
                    }
                }else {
                    for(int i=0;i<matrix[0].length-row;i++){
                        res.add(matrix[start][start_L-i]);
                    }
                }
                if(col%2==0) {
                    start_L = matrix[0].length - row-1+col/2;
                    start_H +=1;
                }else {
                    start_L=(row)/2;
                    start_H-=1;
                }
                H=true;
                col++;
            }
        }
        return res;
    }

对于位置更行部分代码没有做详细的介绍,因为这部分就是探索找到的,要是做详细推导应该也可以,但我觉得一道题而已,能跑通就很好了。

LeetCodeNo_54_第1张图片

你可能感兴趣的:(leetCode,刷题)