多米诺骨牌均衡状态| 豆包MarsCode AI刷题

45 阅读3分钟

问题回顾

在骨牌的模拟倒下过程中:

  1. L 表示骨牌向左倒。
  2. R 表示骨牌向右倒。
  3. . 表示骨牌目前竖立,需要判断是否会因左侧或右侧的推力倒下。

目标是:经过所有力的作用后,统计最终仍然竖立的骨牌数量和位置。


解题思路

为了解决这个问题,我们需要明确骨牌如何受力并确定是否倒下。为此,我们使用以下步骤:


1. 初始化受力数组

我们创建一个与骨牌状态相同长度的数组 forces,用来存储每个骨牌受的“力”:

  • 正数 表示右推的力(R 的影响)。
  • 负数 表示左推的力(L 的影响)。
  • 0 表示骨牌既没有受到左推也没有受到右推的影响。

2. 从左向右遍历,计算右推力

我们模拟右推力的传播过程:

  • 遇到 R:设置当前的力值为一个较大的数(我们取 num,即骨牌总数量,表示强推力)。
  • 遇到 L:右推力无法继续传播,将力值重置为 0。
  • 遇到 . :右推力逐渐衰减,每往右传播一格,力值减 1,直到减为 0。

通过这个过程,我们可以记录右推力的影响范围和强度。


3. 从右向左遍历,计算左推力

同理,我们模拟左推力的传播过程:

  • 遇到 L:设置当前的力值为一个较大的数(同样取 num,表示强推力)。
  • 遇到 R:左推力无法继续传播,将力值重置为 0。
  • 遇到 . :左推力逐渐衰减,每往左传播一格,力值减 1,直到减为 0。

遍历结束后,右推力和左推力的影响会分别记录在 forces 数组中,但注意:

  • 右推力的值是正数
  • 左推力的值是负数

4. 合并结果,判断骨牌是否竖立

对每个骨牌位置,我们根据 forces 数组的值:

  • 如果力值为 0 且骨牌为 .,说明它既没有受到左推也没有受到右推,可以保持竖立。
  • 其他情况(力值不为 0),骨牌会倒下。

示例详解

以测试样例 num = 14, data = ".L.R...LR..L.." 为例:

第一步:从左向右计算右推力

遍历骨牌字符串:

  • 初始 forces = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

  • 遇到第 4 个骨牌 R,设置右推力为 14。

  • 接下来右推力逐渐衰减,每向右一格减 1,直到遇到第 8 个骨牌 L,右推力被重置为 0。

  • 最终右推力对 forces 的影响为:

    css
    复制代码
    forces = [0, 0, 0, 14, 13, 12, 11, 0, 0, 0, 0, 0, 0, 0]
    

第二步:从右向左计算左推力

再次遍历骨牌字符串:

  • 初始 forces 保持不变。

  • 遇到第 8 个骨牌 L,设置左推力为 -14。

  • 接下来左推力逐渐衰减,每向左一格加 1(注意:是负值逐渐变小),直到遇到第 4 个骨牌 R,左推力被重置为 0。

  • 最终左推力对 forces 的影响为:

    css
    复制代码
    forces = [0, -12, -13, 14, 13, 12, 11, -14, -13, -12, -11, -10, -9, -8]
    

第三步:计算最终稳定的骨牌

根据合并后的 forces

  • 第 3、6、13、14 位置的 forces 值为 0,且对应的骨牌为 .,这些骨牌保持竖立。
  • 稳定骨牌的位置为 [3, 6, 13, 14]

输出结果

根据竖立骨牌数量和位置,格式化输出结果为:

arduino
复制代码
"4:3,6,13,14"

复杂度分析

  1. 时间复杂度:O(n),其中 n 为骨牌的数量。遍历字符串两次(从左向右和从右向左),每次都是 O(n)。
  2. 空间复杂度:O(n),使用了一个长度为 n 的数组 forces 来存储力的计算结果。