字节面试做不出来的螺旋矩阵leetcode54

这是一道模拟题,模拟这个绕着边界走的过程就可以了。

第一种办法很直观,用四个变量规定好最外围那一圈的行和列的上界和下界。代码如下:

List<Integer> list = new LinkedList<>();
        int a = 0, b = matrix[0].length - 1, c = 0, d = matrix.length - 1;//a是最外圈列的开始,b是列的结束,c是行的开始, d是行的结束
        while (!(a == b && b == c && c == d)) {
            int i = 0;
            for (i = a; i <= b; i++) {
                list.add(matrix[c][i]);
            }
            for (i = c + 1; i <= d; i++) {
                list.add(matrix[i][b]);
            }
            for (i = b - 1; i >= a; i--) {
                list.add(matrix[d][i]);
            }
            for (i = d - 1; i >= c + 1; i--) {
                list.add(matrix[i][a]);
            }
            a++;
            b--;
            c++;
            d--;
        }
        list.add(matrix[a][c]);//加最里面那个
        return list;

 

面试的时候面试官也是暗示我用四个变量,做出来了,可是遇到数组大的时候,这个方法的时间耗时有点大,leetcode不让过。后来我找到一种更机智的写法,如下:

public List<Integer> spiralOrder(int[][] matrix) {
        int x = 0;
        int y = 0;
        int total = 0;
        int rowNum = matrix.length;
        int columnNum = matrix[0].length;
        int dx = 0;//x的增加
        int dy = 1;//y的增加  0,1 -> 1,0 -> 0,-1 -> -1,0
        List<Integer> list = new LinkedList<>();

        while (total < rowNum * columnNum) {
            list.add(matrix[x][y]);
            total++;
            matrix[x][y] = 101;//设置为非法数
            if (!(x+dx >= 0 && x+dx <rowNum && y+dy >= 0 && y+dy < columnNum && matrix[x+dx][y+dy] != 101)) {
                int temp = dx;
                dx = dy;
                dy = -temp;
            }
            x += dx;
            y += dy;
        }
        return list;
    }

秒就秒在,dx和dy表示了此刻x和y应该变化的值。到达边界之后,通过变化dx和dy,使得x和y也转90°。

posted @ 2022-01-08 11:22  ou尼酱~~~  阅读(101)  评论(0)    收藏  举报