当前位置:   article > 正文

​力扣解法汇总1769. 移动所有球到每个盒子所需的最小操作数_每次可以向右或者向左移动 球把所有字符连起来的最小移动次数

每次可以向右或者向左移动 球把所有字符连起来的最小移动次数

 目录链接:

力扣编程题-解法汇总_分享+记录-CSDN博客

GitHub同步刷题项目:

https://github.com/September26/java-algorithms

原题链接:力扣


描述:

有 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]

提示:

  • n == boxes.length
  • 1 <= n <= 2000
  • boxes[i] 为 '0' 或 '1'

解题思路:

* 解题思路:
* 以i的位置来进行分割,分为left和right。
* 先求出rightSum和rightNum,然后遍历boxes。
* result[i]其实就等于把左侧的往右挪,把右侧的往左挪,最终求出其sum值和。
* 所以遍历的时候,遍历一个位置,就可以对应计算leftNum和leftSum,然后重新加计算右侧的rightSum和rightNum。

代码:

  1. public class Solution1769 {
  2. public int[] minOperations(String boxes) {
  3. int leftSum = 0;
  4. int leftNum = 0;
  5. int rightSum = 0;
  6. int rightNum = 0;
  7. char[] chars = boxes.toCharArray();
  8. for (int i = 0; i < chars.length; i++) {
  9. if (chars[i] == '0') {
  10. continue;
  11. }
  12. rightNum++;
  13. rightSum += (i);
  14. }
  15. int[] result = new int[boxes.length()];
  16. for (int i = 0; i < chars.length; i++) {
  17. result[i] = Math.abs(rightSum - i * rightNum) + Math.abs(leftSum - i * leftNum);
  18. if (chars[i] == '1') {
  19. leftNum++;
  20. leftSum += i;
  21. rightSum -= i;
  22. rightNum--;
  23. }
  24. }
  25. return result;
  26. }
  27. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/588003
推荐阅读
相关标签
  

闽ICP备14008679号