LeetCode-1706 球会落何处
本文最后更新于:2025年2月15日 上午
LeetCode 1706:球会落何处
题目描述
用一个大小为 m x n
的二维网格 grid
表示一个箱子。你有 n
颗球。箱子的顶部和底部都是开着的。
箱子中的每个单元格都有一个对角线挡板,跨过单元格的两个角,可以将球导向左侧或者右侧。
- 将球导向右侧的挡板跨过左上角和右下角,在网格中用
1
表示。 - 将球导向左侧的挡板跨过右上角和左下角,在网格中用
-1
表示。
在箱子每一列的顶端各放一颗球。每颗球都可能卡在箱子里或从底部掉出来。如果球恰好卡在两块挡板之间的 “V” 形图案,或者被一块挡导向到箱子的任意一侧边上,就会卡住。
返回一个大小为 n
的数组 answer
,其中 answer[i]
是球放在顶部的第 i
列后从底部掉出来的那一列对应的下标,如果球卡在盒子里,则返回 -1
。
示例 1:

1 |
|
示例 2:
1 |
|
示例 3:
1 |
|
提示:
m == grid.length
n == grid[i].length
1 <= m, n <= 100
grid[i][j]
为1
或-1
题解
模拟法
我们可以模拟每个球的运动过程。对于每个球,从顶部开始,逐行检查其运动轨迹:
当前挡板导向右侧(
grid[x][y] == 1
):- 如果球位于最右侧(
y == n-1
),或者右侧挡板导向左侧(grid[x][y+1] == -1
),则球会卡住。 - 否则,球会移动到下一行的右侧列(
x += 1
,y += 1
)。
- 如果球位于最右侧(
当前挡板导向左侧(
grid[x][y] == -1
):- 如果球位于最左侧(
y == 0
),或者左侧挡板导向右侧(grid[x][y-1] == 1
),则球会卡住。 - 否则,球会移动到下一行的左侧列(
x += 1
,y -= 1
)。
- 如果球位于最左侧(
终止条件:
- 如果球成功移动到最后一行(
x == m
),则返回当前列y
。 - 如果球在任何时候卡住,则返回
-1
。
- 如果球成功移动到最后一行(
1 |
|
复杂度分析
- 时间复杂度:
O(m * n)
,其中m
是网格的行数,n
是网格的列数。每个球最多需要遍历m
行。 - 空间复杂度:
O(n)
,用于存储结果数组answer
。
LeetCode-1706 球会落何处
https://furthur509.github.io/2025/02/15/LeetCode 1706:球会落何处/