【动态规划】leetcode-1706.球会落何处
发布日期:2021-05-24 08:29:03 浏览次数:12 分类:精选文章

本文共 1700 字,大约阅读时间需要 5 分钟。

答案如下:

一款优雅的表达方式:

在这个问题中,我们需要模拟球在逐层移动的过程中如何被挡板导向,并最终确定每个球掉落的位置。我们使用动态规划的方法来逐层更新每个球的位置,直到所有球的位置稳定。

步骤如下:

  • 初始化动态规划数组 dp,其中 dp[j] 表示球 j 在该层的位置。初始时,dp[j] = j,即每个球最初位于它所在的列。

  • 对于每一层 i,从左到右遍历每一列 j

    • 如果当前层的列 j 已被标记为卡住(dp[j] == -1),则继续下一列。
    • 检查当前单元格 grid[i][col] 的值:
      • 如果值为 1,说明球试图向右移动:
        • 检查右侧单元格 grid[i][col+1] 是否可以继续向右移动:
          • 如果右侧单元格允许向右移动,则 dp[j] 更新为 col+1
          • 否则,检查当前单元格是否允许,若否则 dp[j] 更新为 col
      • 如果值为 -1,说明球试图向左移动:
        • 检查左侧单元格 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 次循环,每次处理一层。
    • 处理每一列球的位置:使用嵌套循环,逐列检查球的位置变化。
    • 动态更新位置:根据挡板方向和边界,更新球的位置,标记为-1 表示卡住。
    • 最终返回结果:处理完所有层后返回最终的 dp 数组,即每个球掉落的列索引或-1 表示卡住。
    上一篇:【动态规划】leetcode-1262.可被3整除的最大和
    下一篇:【链表】leetcode-83.删除排序链表中的重复元素I

    发表评论

    最新留言

    路过按个爪印,很不错,赞一个!
    [***.219.124.196]2025年05月10日 09时08分20秒