题目
题解
注:
bottom应该为: c from c2-1 ... c1+1
left应该为: r from r2 ... r1+1
代码
import java.util.*;
public class code54 {
public static List<Integer> spiralOrder(int[][] matrix) {
List<Integer> ans = new ArrayList<>();
if (matrix.length == 0) {
return ans;
}
int R = matrix.length;
int C = matrix[0].length;
boolean visit[][] = new boolean[R][C];
int dr[] = { 0, 1, 0, -1 };
int dc[] = { 1, 0, -1, 0 };
// 当前所在位置为 (r, c),前进方向是 di
int r = 0;
int c = 0;
int di = 0;
for (int i = 0; i < R * C; i++) {
ans.add(matrix[r][c]);
visit[r][c] = true;
// 下一步候选移动位置是 (cr, cc)
int cr = r + dr[di];
int cc = c + dc[di];
if (0 <= cr && cr < R && 0 <= cc && cc < C && !visit[cr][cc]) {
r = cr;
c = cc;
} else {
di = (di + 1) % 4;
r += dr[di];
c += dc[di];
}
}
return ans;
}
// public static List<Integer> spiralOrder(int[][] matrix) {
// List<Integer> ans = new ArrayList<>();
// if (matrix.length == 0) {
// return ans;
// }
// int r1 = 0;
// int r2 = matrix.length - 1;
// int c1 = 0;
// int c2 = matrix[0].length - 1;
// while (r1 <= r2 && c1 <= c2) {
// for (int c = c1; c <= c2; c++) {
// ans.add(matrix[r1][c]);
// }
// for (int r = r1 + 1; r <= r2; r++) {
// ans.add(matrix[r][c2]);
// }
// if (r1 < r2 && c1 < c2) {
// for (int c = c2 - 1; c >= c1 + 1; c--) {
// ans.add(matrix[r2][c]);
// }
// for (int r = r2; r >= r1 + 1; r--) {
// ans.add(matrix[r][c1]);
// }
// }
// r1++;
// c1++;
// r2--;
// c2--;
// }
// return ans;
// }
public static void main(String[] args) {
int matrix[][] = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } };
List<Integer> res = spiralOrder(matrix);
System.out.println(res);
}
}