
【动态规划】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
。
- 如果左侧单元格允许向左移动,则
- 检查左侧单元格
- 如果值为 1,说明球试图向右移动:
- 否则,标记当前球位置为卡住,
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 表示卡住。
发表评论
最新留言
路过按个爪印,很不错,赞一个!
[***.219.124.196]2025年05月10日 09时08分20秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
剑指 Offer 11. 旋转数组的最小数字
2019-03-15
word文档注入(追踪word文档)未完
2019-03-15
作为我的第一篇csdn博客吧
2019-03-15
ajax异步提交失败
2019-03-15
一道简单的访问越界、栈溢出pwn解题记录
2019-03-15
Stream 某些API
2019-03-15
测试调用另一台电脑ip是否有用
2019-03-15
mos-excel集成文档
2019-03-15
chat 快问!
2019-03-15
6.Xml
2019-03-15
Linux总结
2019-03-15
DKT—Going Deeper with Deep Knowledge Tracing
2019-03-15
响应的HTTP协议格式+常见的响应码
2019-03-15
创建线程方式
2019-03-15
LRUCache
2019-03-15
关于Linux系统中touch命令的说明
2019-03-15
将windows里的内容直接复制粘贴到ubuntu,提高效率
2019-03-15
将tomcat设置成window自启动服务
2019-03-15
webservice 远程服务器返回错误:(400)错误的请求
2019-03-15
[日常] PHP与Mysql测试kill慢查询并检验PDO的错误模式
2019-03-15