#54螺旋矩阵medium

#54medim
code1:
//注意up主right在初始化和进行下一圈更新时是不一样的哦
//int right = column - 1 - round * 2;
//因为第一圈第[0,0]元素提前插入(进入循环还未更新步就马上插入)
//right = column - round * 2;
//而后面每一圈第[0,0]元素都是在循环下一步才插入(本次循环是插入上一圈最后一个数)
class Solution {
    //使用4个int right,down,left,up来记录当前要向这四个方向前进的优先级和前进的步数
    public List<Integer> spiralOrder(int[][] matrix) {
        List<Integer> result = new ArrayList<>();
        int row = matrix.length;
        if (row == 0) {
            return result;
        }
        int column = matrix[0].length;

        int size = row * column;
        //当前已经前进的步数
        int currentPosition = 0;
        //当前走到的行index
        int currentRow = 0;
        //当前走到的列index
        int currentColumn = 0;
        //当前走的圈数,right,down,left,up同时为0说明一圈已经走完,round++
        int round = 0;

        int right = column - 1 - round * 2;
        int down = row - 1 - round * 2;
        int left = column - 1 - round * 2;
        int up = row - 2 - round * 2;

        while (currentPosition < size) {
            result.add(matrix[currentRow][currentColumn]);
            //向右前进步数未完,继续向右前进
            if (right > 0) {
                currentColumn++;
                right--;
            } else if (down > 0) {
                //向下前进步数未完,继续向下前进
                currentRow++;
                down--;
            } else if (left > 0) {
                //向左前进步数未完,继续向左前进
                currentColumn--;
                left--;
            } else if (up > 0) {
                //向上前进步数未完,继续向上前进
                currentRow--;
                up--;
                if (up == 0) {
                    //right,down,left,up同时为0,一圈已经走完,round++,并重置下一圈四个方向要走的步数
                    round++;
                    right = column - round * 2;
                    down = row - 1 - round * 2;
                    left = column - 1 - round * 2;
                    up = row - 2 - round * 2;
                }
            }
            currentPosition++;
        }
        return result;
    }
}

code2:
//重要的是要确定上下左右四条边的位置,
//那么初始化的时候,上边up就是0,下边down就是m-1,左边left是0,右边right是n-1。
//然后我们进行while循环,先遍历上边,将所有元素加入结果res,然后上边下移一位,
//如果此时上边大于下边,说明此时已经遍历完成了,直接break。
//同理对于下边,左边,右边,依次进行相对应的操作,
//这样就会使得坐标很有规律,并且不易出错
class Solution {
    public List<Integer> spiralOrder(int[][] matrix) {
        if(matrix.length==0 || matrix[0].length==0)
            return new ArrayList<Integer>();
        int row_num=matrix.length;
        int col_num=matrix[0].length;
        List<Integer> ans=new ArrayList<>();
        int up=0,down=row_num-1,left=0,right=col_num-1;
        while(true){
            for(int j=left;j<=right;j++)
                ans.add(matrix[up][j]);
            if(++up>down) break;
            for(int j=up;j<=down;j++)
                ans.add(matrix[j][right]);
            if(--right<left) break;
            for(int j=right;j>=left;j--)
                ans.add(matrix[down][j]);
            if(--down<up) break;
            for(int j=down;j>=up;j--)
                ans.add(matrix[j][left]);
            if(++left>right) break;
        }
        return ans;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值