博客
关于我
【动态规划】leetcode-1706.球会落何处
阅读量:703 次
发布时间:2019-03-21

本文共 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 表示卡住。

    转载地址:http://ftbrz.baihongyu.com/

    你可能感兴趣的文章
    执行引擎概述
    查看>>
    JAVA代码编译和执行过程
    查看>>
    机器码、指令、汇编语言
    查看>>
    G1中的String去重操作
    查看>>
    增量收集算法、分区算法
    查看>>
    密码学的基本概念
    查看>>
    JavaScript内置对象
    查看>>
    数据库和SQL 概述
    查看>>