📅  最后修改于: 2023-12-03 15:09:34.364000             🧑  作者: Mango
给定一个由 0 和 1 组成的二进制数组 nums
,你需要将所有的 0 移动到数组末尾,同时保持原数组的相对顺序。
其中,将每个 1 移动至相邻索引的移动成本为 1。
请计算将全1 移动至给定数组 nums
的每个索引所需的最小总成本。
要将全1移至给定数组的每个索引,需要找出其中最小的移动成本,然后将成本累加起来,得出所需的最小总成本。
具体实现方法如下:
定义变量 count
用于记录移动成本。
遍历数组,记录下所有 1 的索引,将它们存入一个列表中,设为 ones
。
对 ones
进行循环,计算每个 1 到下一个相邻 1 的距离,得出一个距离列表,设为 distances
。
计算 distances
列表中的最小值,即为将当前 1 移动到下一个相邻 1 所需的最小移动成本,将其累加到 count
变量中。
将当前 1 所在的索引更新为下一个相邻 1 的索引。
重复步骤 4 和 5 直至 ones
列表中所有的 1 均已被移动到末尾。
返回变量 count
,即为将全1移至给定数组的每个索引所需的最小总成本。
def min_cost(nums: List[int]) -> int:
ones = [i for i, num in enumerate(nums) if num == 1]
count = 0
while ones:
distances = [ones[i+1] - ones[i] for i in range(len(ones)-1)]
min_distance = min(distances)
count += min_distance
ones[0] += min_distance
ones.pop(0)
return count
本问题利用了贪心思想,每次计算出将当前 1 移动到下一个相邻 1 所需的最小成本,然后将其累加起来,得出全局最小总成本。
需要注意的是,此算法中将每个 1 移动到末尾的成本默认为 0,因为每次移动的过程中都是先将 0 移至末尾,然后再将 1 移动至相邻索引。