列表

详情


1769. 移动所有球到每个盒子所需的最小操作数

n 个盒子。给你一个长度为 n 的二进制字符串 boxes ,其中 boxes[i] 的值为 '0' 表示第 i 个盒子是 的,而 boxes[i] 的值为 '1' 表示盒子里有 一个 小球。

在一步操作中,你可以将 一个 小球从某个盒子移动到一个与之相邻的盒子中。第 i 个盒子和第 j 个盒子相邻需满足 abs(i - j) == 1 。注意,操作执行后,某些盒子中可能会存在不止一个小球。

返回一个长度为 n 的数组 answer ,其中 answer[i] 是将所有小球移动到第 i 个盒子所需的 最小 操作数。

每个 answer[i] 都需要根据盒子的 初始状态 进行计算。

 

示例 1:

输入:boxes = "110"
输出:[1,1,3]
解释:每个盒子对应的最小操作数如下:
1) 第 1 个盒子:将一个小球从第 2 个盒子移动到第 1 个盒子,需要 1 步操作。
2) 第 2 个盒子:将一个小球从第 1 个盒子移动到第 2 个盒子,需要 1 步操作。
3) 第 3 个盒子:将一个小球从第 1 个盒子移动到第 3 个盒子,需要 2 步操作。将一个小球从第 2 个盒子移动到第 3 个盒子,需要 1 步操作。共计 3 步操作。

示例 2:

输入:boxes = "001011"
输出:[11,8,5,4,3,4]

 

提示:

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
class Solution { public: vector<int> minOperations(string boxes) { } };

golang 解法, 执行用时: 4 ms, 内存消耗: 5 MB, 提交时间: 2021-06-08 17:26:40

func minOperations(boxes string) []int {
	n := len(boxes)
	ans := make([]int, n)
	left, right, total := 0, 0, 0  // 左边盒子个数, 右边盒子个数, 操作数
	if boxes[0] == '1' {
		left++
	}
	for i := 1; i < n; i++ {
		if boxes[i] == '1' {
			right++
			total += i
		}
	}
	ans[0] = total

	for i := 1; i < n; i++ {
		total += left - right
		if boxes[i] == '1' {
			left++
			right--
		}
		ans[i] = total
	}

	return ans
}

上一题