0%

LeetCode-59

题目

结果

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
class Solution {
private final int RIGHT = 0, DOWN = 1, LEFT = 2, UP = 3;
private int DIRECTION = 0;

public int[][] generateMatrix(int n) {
// save the final answer
int[][] ans = new int[n][n];
// if the num has been visited
boolean[][] flag = new boolean[n][n];
int i = 0, j = 0;
int val = 1;
while (true) {
ans[i][j] = val;
val++;
flag[i][j] = true;
if (!reachable(flag, i, j)) {
// time to change the direction
DIRECTION = (DIRECTION + 1) % 4;
// it's done
if (!reachable(flag, i, j)) {
break;
}
}
if (DIRECTION == RIGHT) {
j++;
} else if (DIRECTION == DOWN) {
i++;
} else if (DIRECTION == LEFT) {
j--;
} else if (DIRECTION == UP) {
i--;
}
}
return ans;
}

private boolean reachable(boolean[][] flag, int row, int col) {
if (DIRECTION == RIGHT) {
if (col + 1 >= flag[0].length) {
return false;
} else return !flag[row][col + 1];
}

if (DIRECTION == DOWN) {
if (row + 1 >= flag.length) {
return false;
} else return !flag[row + 1][col];
}

if (DIRECTION == LEFT) {
if (col - 1 < 0) {
return false;
} else return !flag[row][col - 1];
}

if (DIRECTION == UP) {
if (row - 1 < 0) {
return false;
} else return !flag[row - 1][col];
}

throw new RuntimeException("Impossible");
}
}

复杂度

时间复杂度:O(n²)

空间复杂度:O(n²)