【每日一题Day44】LC1769移动所有球到每个盒子所需要的最小操作数 | 模拟 贡献

简介: 思路:将所有球移入盒子i ii所需要的操作数取决于其右侧盒子内的小球和左侧盒子内的小球至其的距离,最终操作数即为距离的累加和。因此盒子i + 1 i+1i+1所需要的操作数,可以由盒子i ii所需要的操作数推出。

移动所有球到每个盒子所需要的最小操作数【LC1769】


You have n boxes. You are given a binary string boxes of length n, where boxes[i] is '0' if the ith box is empty, and '1' if it contains one ball.


In one operation, you can move one ball from a box to an adjacent box. Box i is adjacent to box j if abs(i - j) == 1. Note that after doing so, there may be more than one ball in some boxes.


Return an array answer of size n, where answer[i] is the minimum number of operations needed to move all the balls to the ith box.


Each answer[i] is calculated considering the initial state of the boxes.


我承认我飘了


暴力


  • 思路:暴力


如果第j jj个盒子里装有小球,那么移到到第i ii个盒子,所需要的操作数为a b s ( j − i ) abs(j-i)abs(j−i),累加计算总和既可


  • 实现


class Solution {
    public int[] minOperations(String boxes) {
        int n = boxes.length();
        int[] res = new int[n];
        for (int i = 0; i < n; i++){
            for (int j = 0; j < n; j++){
                if (boxes.charAt(j) == '1'){
                    res[i] += Math.abs(j - i);
                }
            }
        }
        return res;
    }
}


。复杂度


  • 时间复杂度:O(n 2 )
  • 空间复杂度:O ( 1 )


贡献


  • 思路:将所有球移入盒子i 所需要的操作数取决于其右侧盒子内的小球和左侧盒子内的小球至其的距离,最终操作数即为距离的累加和。因此盒子i+1所需要的操作数,可以由盒子i ii所需要的操作数推出。


。假设所有球移入盒子i 所需要的操作数为r e s i ,右侧盒子的小球个数为r i g h t i ,左侧盒子的小球个数为l e f t i (包括其自身),那么盒子i+1所需要的操作数为 resi+lefti-righti


  • 实现


class Solution {
    public int[] minOperations(String boxes) {
        int n = boxes.length();
        int[] res = new int[n];
        int left = boxes.charAt(0) - '0';
        int right = 0;
        for (int i = 1; i < n; i++){
            if (boxes.charAt(i) == '1'){
                right++;
                res[0] += i;
            }
        }
        for (int i = 1; i < n; i++){
            res[i] = res[i-1] + left - right;
            if (boxes.charAt(i) == '1'){
                left++;
                right--;
            }
        }
        return res;
    }
}


。复杂度


  • 时间复杂度:O ( n )
  • 空间复杂度:O ( 1 )
目录
相关文章
|
8月前
|
算法 测试技术
枚举(蓝桥练习)(反倍数、特别数的和、找到最多的数、小蓝的漆房、小蓝和小桥的挑战)
枚举(蓝桥练习)(反倍数、特别数的和、找到最多的数、小蓝的漆房、小蓝和小桥的挑战)
|
8月前
【每日一题Day312】LC2240买钢笔和铅笔的方案数 | 完全背包 数学
【每日一题Day312】LC2240买钢笔和铅笔的方案数 | 完全背包 数学
65 0
|
8月前
【每日一题Day345】LC2562找出数组的串联值 | 模拟
【每日一题Day345】LC2562找出数组的串联值 | 模拟
45 0
|
8月前
【每日一题Day179】LC1157子数组中占绝大多数的元素 | 线段树
【每日一题Day179】LC1157子数组中占绝大多数的元素 | 线段树
55 0
|
8月前
【每日一题Day133】LC2373矩阵中的局部最大值 | 模拟
【每日一题Day133】LC2373矩阵中的局部最大值 | 模拟
54 0
|
8月前
【错题集-编程题】孩子们的游戏(圆圈中最后剩下的数)(约瑟夫环)
【错题集-编程题】孩子们的游戏(圆圈中最后剩下的数)(约瑟夫环)
|
8月前
|
算法 测试技术
day2·算法-快乐数-有效三角形个数
day2·算法-快乐数-有效三角形个数
43 0
|
8月前
【每日一题Day171】LC1125最小的必要团队 | 01背包 位运算
【每日一题Day171】LC1125最小的必要团队 | 01背包 位运算
48 1
|
8月前
【每日一题Day353】LC2525根据规则将箱子分类 | 模拟
【每日一题Day353】LC2525根据规则将箱子分类 | 模拟
35 0
|
8月前
【每日一题Day308】LC57插入区间 | 模拟
【每日一题Day308】LC57插入区间 | 模拟
51 0