字节面试做不出来的螺旋矩阵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°。

浙公网安备 33010602011771号