题目
我居然面试的时候做过 QAQ 不过我做的是反过程是给出一个数组写出矩阵(肯定是n*n)的
模拟 这就不需要解释了而且官方代码比我写的容易看懂
class Solution {
public int[] spiralOrder(int[][] matrix) {
if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {
return new int[0];
}
int rows = matrix.length, columns = matrix[0].length;
boolean[][] visited = new boolean[rows][columns];
int total = rows * columns;
int[] order = new int[total];
int row = 0, column = 0;
int[][] directions = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
int directionIndex = 0;
for (int i = 0; i < total; i++) {
order[i] = matrix[row][column];
visited[row][column] = true;
int nextRow = row + directions[directionIndex][0], nextColumn = column + directions[directionIndex][1];
if (nextRow < 0 || nextRow >= rows || nextColumn < 0 || nextColumn >= columns || visited[nextRow][nextColumn]) {
directionIndex = (directionIndex + 1) % 4;
}
row += directions[directionIndex][0];
column += directions[directionIndex][1];
}
return order;
}
}
按层模拟
class Solution {
public int[] spiralOrder(int[][] matrix) {
if (matrix.length == 0) {
return new int[0];
}
int[] res = new int[matrix.length * matrix[0].length];
int u = 0, d = matrix.length - 1, l = 0, r = matrix[0].length - 1;
int idx = 0;
//按照每一层的上下左右模拟
while (true) {
for (int i = l; i <= r; i++) {
res[idx++] = matrix[u][i];
}
if (++u > d) { //++u表示会先让u加一
break;
}
for (int i = u; i <= d; i++) {
res[idx++] = matrix[i][r];
}
if (--r < l) {
break;
}
for (int i = r; i >= l; i--) {
res[idx++] = matrix[d][i];
}
if (--d < u) {
break;
}
for (int i = d; i >= u; i--) {
res[idx++] = matrix[i][l];
}
if (++l > r) {
break;
}
}
return res;
}
}