本文共 1700 字,大约阅读时间需要 5 分钟。
答案如下:
一款优雅的表达方式:
在这个问题中,我们需要模拟球在逐层移动的过程中如何被挡板导向,并最终确定每个球掉落的位置。我们使用动态规划的方法来逐层更新每个球的位置,直到所有球的位置稳定。
步骤如下:
初始化动态规划数组 dp
,其中 dp[j]
表示球 j 在该层的位置。初始时,dp[j] = j
,即每个球最初位于它所在的列。
对于每一层 i
,从左到右遍历每一列 j
:
j
已被标记为卡住(dp[j] == -1
),则继续下一列。grid[i][col]
的值: grid[i][col+1]
是否可以继续向右移动: dp[j]
更新为 col+1
。dp[j]
更新为 col
。grid[i][col-1]
是否可以继续向左移动: dp[j]
更新为 col-1
。dp[j]
更新为 col
。dp[j] = -1
。将每一层的更新结果存储在 new_dp
,并替换原 dp
数组。
重复上述过程直到所有球的位置稳定,即没有更改。
最终,dp
数组中每个位置的值即为每个球掉落的最终列数。如果任何球无法移动,则对应位置为 -1。
class Solution: def findBall(self, grid: List[List[int]]) -> List[int]: m = len(grid) if m == 0: return [] n = len(grid[0]) dp = list(range(n)) for i in range(m): new_dp = dp.copy() for j in range(n): col = dp[j] if col == -1: continue # 检查当前位置是否被卡住 if grid[i][col] == 1 and col < n - 1 and grid[i][col + 1] == 1: if new_dp[j] != col + 1: new_dp[j] = col + 1 elif grid[i][col] == -1 and col > 0 and grid[i][col - 1] == -1: if new_dp[j] != col - 1: new_dp[j] = col - 1 else: if new_dp[j] != -1: new_dp[j] = -1 dp = new_dp return dp
dp
数组:dp
数组初始化为 [0, 1, 2, ..., n-1]
,表示每个球最初位于对应的列。m
次循环,每次处理一层。dp
数组,即每个球掉落的列索引或-1 表示卡住。转载地址:http://ftbrz.baihongyu.com/