Python程序:查找将所有球移动到每个盒子的最小操作次数


假设我们有一个名为 boxes 的二进制字符串,其中 boxes[i] 为 '0' 表示第 i 个盒子为空,'1' 表示它包含一个球。现在,在一个操作中,我们可以将一个球从一个盒子移动到相邻的盒子。这样做之后,某些盒子中可能有多个球。我们必须找到一个大小为 n 的数组 answer,其中 answer[i] 是将所有球移动到第 i 个盒子的最小操作次数。

因此,如果输入类似于 boxes = "1101",则输出将为 [4, 3, 4, 5]

  • 要将所有球放在第一个盒子上,我们必须从 box2 中取一个球,需要一次操作,从最后一个球取,需要三次操作,所以总共 4 次操作。

  • 要将所有球放在第二个盒子上,我们必须从 box1 中取一个球,需要一次操作,从最后一个球取,需要两次操作,所以总共 3 次操作。

  • 要将所有球放在第三个盒子上,我们必须从 box2 和最后一个盒子分别取一个球,各需要一次操作,从 box1 取,需要两次操作,所以总共 4 次操作。

  • 要将所有球放在最后一个盒子上,我们必须从 box1 取,需要三次操作,从 box2 取,需要两次操作,所以总共 5 次操作。

为了解决这个问题,我们将遵循以下步骤:

  • left := 0,right := 0,dist := 0

  • 对于范围从 0 到 boxes 大小 - 1 的 i,执行以下操作:

    • 如果 boxes[i] 与 "1" 相同,则:

      • dist := dist + i

      • 如果 i 与 0 相同,则:

        • left := left + 1

      • 否则:

        • right := right + 1

  • arr := 一个列表,最初将 dist 放入其中

  • 对于范围从 1 到 boxes 大小 - 1 的 i,执行以下操作:

    • 在 arr 的末尾插入 arr[i-1] + left - right

    • 如果 boxes[i] 与 "1" 相同,则:

      • left := left + 1

      • right := right - 1

  • 返回 arr

示例

让我们看看下面的实现,以便更好地理解:

def solve(boxes):
   left = 0
   right = 0

   dist = 0
   for i in range(len(boxes)):
      if boxes[i] == "1":
         dist += i
         if i == 0:
            left += 1
         else:
            right += 1
   arr = [dist]
   for i in range(1, len(boxes)):
      arr.append(arr[i-1] + left - right)
      if boxes[i] == "1":
         left += 1
         right -= 1
   return arr

boxes = "1101"
print(solve(boxes))

输入

"1101"

输出

[4, 3, 4, 5]

更新于: 2021年10月6日

660 次查看

开启你的职业生涯

通过完成课程获得认证

开始学习
广告

© . All rights reserved.