用一个大小为 m x n 的二维网格 grid 表示一个箱子。你有 n 颗球。箱子的顶部和底部都是开着的。

箱子中的每个单元格都有一个对角线挡板,跨过单元格的两个角,可以将球导向左侧或者右侧。

将球导向右侧的挡板跨过左上角和右下角,在网格中用 1 表示。
将球导向左侧的挡板跨过右上角和左下角,在网格中用 -1 表示。
在箱子每一列的顶端各放一颗球。每颗球都可能卡在箱子里或从底部掉出来。如果球恰好卡在两块挡板之间的 “V” 形图案,或者被一块挡导向到箱子的任意一侧边上,就会卡住。

返回一个大小为 n 的数组 answer ,其中 answer[i] 是球放在顶部的第 i 列后从底部掉出来的那一列对应的下标,如果球卡在盒子里,则返回 -1 。

思路:
构造一个,球体个数大小的数组result。数组的信息记录小球将要进入下一行,小球的所在的位置。
如果小球无法进入下一行,则数组元素设置为-1。
当遍历到下一行的列时,只遍历result 不为-1的列数。

遍历完数组后,将这个数组中的非-1 元素,设置为1。返回即可。

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
class Solution:
def findBall(self, grid: List[List[int]]) -> List[int]:
rows = len(grid)
colums = len(grid[0])
result=[i for i in range(colums)]

for row_index in range(rows):
for key,col_index in enumerate(result):
if col_index == -1:
continue

if grid[row_index][col_index]==1:
if col_index==colums-1:
result[key] = -1
continue

if grid[row_index][col_index+1]==-1:
result[key] = -1
else:
result[key] = col_index+1
continue
if grid[row_index][col_index]==-1:
if grid[row_index][col_index-1]==1 or col_index==0:
result[key] = -1
else:
result[key] = col_index-1
continue
return result