【每日一题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 )
目录
相关文章
|
7月前
|
算法 测试技术
枚举(蓝桥练习)(反倍数、特别数的和、找到最多的数、小蓝的漆房、小蓝和小桥的挑战)
枚举(蓝桥练习)(反倍数、特别数的和、找到最多的数、小蓝的漆房、小蓝和小桥的挑战)
|
7月前
【每日一题Day312】LC2240买钢笔和铅笔的方案数 | 完全背包 数学
【每日一题Day312】LC2240买钢笔和铅笔的方案数 | 完全背包 数学
61 0
|
7月前
【每日一题Day357】LC1155掷骰子等于目标和的方法数 | dp
【每日一题Day357】LC1155掷骰子等于目标和的方法数 | dp
57 0
|
7月前
【每日一题Day179】LC1157子数组中占绝大多数的元素 | 线段树
【每日一题Day179】LC1157子数组中占绝大多数的元素 | 线段树
52 0
|
7月前
【每日一题Day345】LC2562找出数组的串联值 | 模拟
【每日一题Day345】LC2562找出数组的串联值 | 模拟
41 0
|
7月前
|
人工智能 算法 Java
数据结构与算法面试题:给定 n 个非负整数 a1,a2,a3,...,an,每个数代表坐标中的一个点(i, ai),请找出两个点之间的最大距离。(提示:动态规划)
数据结构与算法面试题:给定 n 个非负整数 a1,a2,a3,...,an,每个数代表坐标中的一个点(i, ai),请找出两个点之间的最大距离。(提示:动态规划)
91 1
|
7月前
|
vr&ar
【每日一题Day166】LC1053交换一次的先前排列 | 贪心
【每日一题Day166】LC1053交换一次的先前排列 | 贪心
72 1
|
7月前
|
C语言
C语言第四十四弹---调整奇偶数顺序
C语言第四十四弹---调整奇偶数顺序
|
7月前
【每日一题Day250】LC1253重构 2 行二进制矩阵 | 贪心模拟
【每日一题Day250】LC1253重构 2 行二进制矩阵 | 贪心模拟
51 0
|
7月前
|
人工智能
力扣每日一题 -- 2919. 使数组变美的最小增量运算数
力扣每日一题 -- 2919. 使数组变美的最小增量运算数