LeetCode 题解工作台
推多米诺
n 张多米诺骨牌排成一行,将每张多米诺骨牌垂直竖立。在开始时,同时把一些多米诺骨牌向左或向右推。 每过一秒,倒向左边的多米诺骨牌会推动其左侧相邻的多米诺骨牌。同样地,倒向右边的多米诺骨牌也会推动竖立在其右侧的相邻多米诺骨牌。 如果一张垂直竖立的多米诺骨牌的两侧同时有多米诺骨牌倒下时,由于受力平衡, …
3
题型
5
代码语言
3
相关题
当前训练重点
中等 · 状态·转移·动态规划
答案摘要
把所有初始受到推力的骨牌(`L` 或 `R`)视作 源点,它们会同时向外扩散各自的力。用队列按时间层级(0, 1, 2 …)进行 BFS: 我们定义 记录第 *i* 张骨牌第一次受力的时刻,`-1` 表示尚未受力,定义 是一个长度可变的列表,存放该骨牌在同一时刻收到的方向(`'L'`、`'R'`)。初始时把所有 `L/R` 的下标压入队列,并将它们的时间置 0。
Interview AiBoxInterview AiBox 实时 AI 助手,陪你讲清 状态·转移·动态规划 题型思路
题目描述
n 张多米诺骨牌排成一行,将每张多米诺骨牌垂直竖立。在开始时,同时把一些多米诺骨牌向左或向右推。
每过一秒,倒向左边的多米诺骨牌会推动其左侧相邻的多米诺骨牌。同样地,倒向右边的多米诺骨牌也会推动竖立在其右侧的相邻多米诺骨牌。
如果一张垂直竖立的多米诺骨牌的两侧同时有多米诺骨牌倒下时,由于受力平衡, 该骨牌仍然保持不变。
就这个问题而言,我们会认为一张正在倒下的多米诺骨牌不会对其它正在倒下或已经倒下的多米诺骨牌施加额外的力。
给你一个字符串 dominoes 表示这一行多米诺骨牌的初始状态,其中:
dominoes[i] = 'L',表示第i张多米诺骨牌被推向左侧,dominoes[i] = 'R',表示第i张多米诺骨牌被推向右侧,dominoes[i] = '.',表示没有推动第i张多米诺骨牌。
返回表示最终状态的字符串。
示例 1:
输入:dominoes = "RR.L" 输出:"RR.L" 解释:第一张多米诺骨牌没有给第二张施加额外的力。
示例 2:
输入:dominoes = ".L.R...LR..L.." 输出:"LL.RR.LLRRLL.."
提示:
n == dominoes.length1 <= n <= 105dominoes[i]为'L'、'R'或'.'
解题思路
方法一:多源 BFS
把所有初始受到推力的骨牌(L 或 R)视作 源点,它们会同时向外扩散各自的力。用队列按时间层级(0, 1, 2 …)进行 BFS:
我们定义 记录第 i 张骨牌第一次受力的时刻,-1 表示尚未受力,定义 是一个长度可变的列表,存放该骨牌在同一时刻收到的方向('L'、'R')。初始时把所有 L/R 的下标压入队列,并将它们的时间置 0。
当弹出下标 i 时,若 只有一个方向,骨牌就会倒向该方向 。设下一张骨牌下标为
若 :
- 若 ,说明 j 从未受力,记录 并入队,同时把 写入 。
- 若 ,说明它在同一“下一刻”已受过另一股力,此时只把 追加到 ,形成对冲;后续因
len(force[j])==2,它将保持竖直。
队列清空后,所有 长度为 1 的位置倒向对应方向;长度为 2 的位置保持 .。最终将字符数组拼接为答案。
时间复杂度 ,空间复杂度 。其中 是骨牌的数量。
class Solution:
def pushDominoes(self, dominoes: str) -> str:
n = len(dominoes)
q = deque()
time = [-1] * n
force = defaultdict(list)
for i, f in enumerate(dominoes):
if f != '.':
q.append(i)
time[i] = 0
force[i].append(f)
ans = ['.'] * n
while q:
i = q.popleft()
if len(force[i]) == 1:
ans[i] = f = force[i][0]
j = i - 1 if f == 'L' else i + 1
if 0 <= j < n:
t = time[i]
if time[j] == -1:
q.append(j)
time[j] = t + 1
force[j].append(f)
elif time[j] == t + 1:
force[j].append(f)
return ''.join(ans)
复杂度分析
| 指标 | 值 |
|---|---|
| 时间 | Depends on the final approach |
| 空间 | O(N) |
面试官常问的追问
外企场景- question_mark
Look for understanding of state transitions in dynamic systems.
- question_mark
Check how well the candidate can optimize a problem involving multiple iterations over a large dataset.
- question_mark
Evaluate the candidate's ability to apply dynamic programming or two pointers in a string manipulation context.
常见陷阱
外企场景- error
Misunderstanding the force balance when both directions act on the same domino, leading to incorrect final states.
- error
Failing to optimize the algorithm, leading to unnecessary time complexity when simulating the falling process.
- error
Incorrect handling of edge cases like dominoes with no initial movement (all '.' characters).
进阶变体
外企场景- arrow_right_alt
Consider variations where dominoes can be pushed in a random sequence instead of initially falling left or right.
- arrow_right_alt
Simulate the scenario with additional constraints such as multiple groups of falling dominoes.
- arrow_right_alt
Implement the solution with a different space complexity requirement, optimizing the algorithm further.