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]
数据结构
网络
关系数据库管理系统
操作系统
Java
iOS
HTML
CSS
Android
Python
C语言编程
C++
C#
MongoDB
MySQL
Javascript
PHP