题目
有 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 个盒子:将一个小球从第 2 个盒子移动到第 1 个盒子,需要 1 步操作。
- 第 2 个盒子:将一个小球从第 1 个盒子移动到第 2 个盒子,需要 1 步操作。
- 第 3 个盒子:将一个小球从第 1 个盒子移动到第 3 个盒子,需要 2 步操作。将一个小球从第 2 个盒子移动到第 3 个盒子,需要 1 步操作。共计 3 步操作。
示例 2:
输入:boxes = "001011"
输出:[11,8,5,4,3,4]
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/minimum-number-of-operations-to-move-all-balls-to-each-box
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解法一:双循环
public static int[] minOperations(String boxes) {
int[] answer= new int[boxes.length()];
for (int i = 0; i < boxes.length(); i++) {
int val = 0;
for (int j = 0; j < boxes.length(); j++) {
if (j == i || boxes.charAt(j) == '0') {
continue;
}
val = val + Math.abs(j - i);
}
answer[i]=val;
}
return answer;
}
解法二:
- 解题思路:
当前单元格所需要移动过来的次数等于左边移动过来的次数加上右面移动过来的次数。
public static int[] minOperations2(String boxes) {
int[] answer= new int[boxes.length()];
int[] left= new int[boxes.length()];
int[] right= new int[boxes.length()];
int operation =0;
if(answer.length<=1)
{
return answer;
}
for (int i = 1; i < left.length; i++) {
if(boxes.charAt(i-1)=='1')
{
operation=operation+1;
}
left[i]=operation+left[i-1];
}
operation=0;
for (int i = right.length-2; i >= 0; i--) {
if(boxes.charAt(i+1)=='1')
{
operation=operation+1;
}
right[i]=operation+right[i+1];
answer[i]=left[i]+right[i];
}
answer[answer.length-1]=left[left.length-1];
return answer;
}
标签:操作数,盒子,int,小球,length,boxes,answer,球到
From: https://www.cnblogs.com/huacha/p/16944058.html