题目地址:
https://leetcode.com/problems/where-will-the-ball-fall/
考虑一个
m
×
n
m\times n
m×n的二维矩阵
g
g
g,只含
−
1
-1
−1和
1
1
1,每个格子看成一个挡板,
−
1
-1
−1代表的是形如/
的挡板,
1
1
1代表的是形如\
的挡板。从第
0
0
0行上方的一共
n
n
n个空位处,每个地方放一个小球,让其自由下落。其或者会卡在边界,或者被卡在中途。要求返回一个数组
A
A
A,
A
[
i
]
A[i]
A[i]表示下标为
i
i
i的小球最终掉在了哪一列,如果卡在中间了则赋值为
−
1
-1
−1。如果下图,
A
[
0
]
=
1
A[0]=1
A[0]=1,因为
0
0
0号球掉在了
1
1
1号列,别的球都卡住了,从而
A
[
i
>
0
]
=
−
1
A[i>0]=-1
A[i>0]=−1。
思路是DFS。枚举每个球,然后模拟掉落的过程。分类讨论每次能向下掉的条件。如果当前在
g
[
i
]
[
j
]
g[i][j]
g[i][j],分两种情况,如果
g
[
i
]
[
j
]
=
1
g[i][j]=1
g[i][j]=1,那么就说明球有向右走的倾向,则需要右边不是墙,并且
g
[
i
]
[
j
+
1
]
=
1
g[i][j+1]=1
g[i][j+1]=1,这样就能走到
(
i
+
1
,
j
+
1
)
(i+1,j+1)
(i+1,j+1)这个位置;如果
g
[
i
]
[
j
]
=
−
1
g[i][j]=-1
g[i][j]=−1,那么就说明球有向左走的倾向,则需要左边不是墙,并且
g
[
i
]
[
j
−
1
]
=
−
1
g[i][j-1]=-1
g[i][j−1]=−1,这样就能走到
(
i
+
1
,
j
−
1
)
(i+1,j-1)
(i+1,j−1)这个位置。走出下边界的时候,
y
y
y坐标的值即为该球掉的地方。代码如下:
public class Solution {
public int[] findBall(int[][] grid) {
int[] res = new int[grid[0].length];
for (int i = 0; i < grid[0].length; i++) {
res[i] = dfs(0, i, grid);
}
return res;
}
private int dfs(int x, int y, int[][] g) {
if (x == g.length) {
return y;
}
if (g[x][y] == 1) {
if (y == g[0].length - 1 || g[x][y + 1] == -1) {
return -1;
} else {
return dfs(x + 1, y + 1, g);
}
} else {
if (y == 0 || g[x][y - 1] == 1) {
return -1;
} else {
return dfs(x + 1, y - 1, g);
}
}
}
}
时间复杂度 O ( m n ) O(mn) O(mn),空间 O ( m ) O(m) O(m)。