【发布时间】:2021-05-25 06:37:52
【问题描述】:
我正在解决一个LeetCode question:将所有球移动到每个盒子的最小操作数。
您有
n框。给定一个长度为n的二进制字符串框,其中boxes[i]如果ith 框为空,则为'0',如果它包含一个球,则为'1'。在一次操作中,您可以将一个球从一个盒子移动到一个相邻的盒子。返回大小为n的数组答案,其中answer[i]是将所有球移动到ith 框所需的最小操作数。对于输入boxes = "001011",输出为:[11,8,5,4,3,4]。
在O(n^2) 中执行此操作是微不足道的。我只能这样解决。我正在尝试了解this O(n) 解决方案,但很难:
class Solution {
public int[] minOperations(String boxes) {
int n = boxes.length();
int[] left = new int[n];
int[] right = new int[n];
int[] ans = new int[n];
int count = boxes.charAt(0) - '0';
for(int i = 1 ; i < n ; i++){
left[i] = left[i - 1] + count;
count += boxes.charAt(i) - '0';
// System.out.println("i: "+i+" left[i]: "+left[i]+" left[i-1] : "+left[i-1]+" count: " + count);
}
count = boxes.charAt(n - 1) - '0';
for(int i = n - 2 ; i >=0 ; i--){
right[i] = right[i + 1] + count;
count += boxes.charAt(i) - '0';
// System.out.println("i: "+i+" right[i]: "+right[i]+" right[i+1] : "+right[i+1]+" count: " + count);
}
for(int i = 0 ; i < n ; i++) {
ans[i] = left[i] + right[i];
}
return ans;
}
}
有人能详细说明一下背后的逻辑吗:
left[i] = left[i - 1] + count;
count += boxes.charAt(i) - '0';
我知道每当遇到球时我们都会增加count,但是left[i] = left[i - 1] + count; 如何帮助我们计算到目前为止将左侧的所有球移动到i 所需的操作数(反之亦然,以防万一right)?
谢谢!
【问题讨论】:
-
基本思想是从索引
i移动到索引i+1会增加每个球向左的操作次数。所以如果左边有count个球,那么操作总数增加count。
标签: java algorithm prefix-sum