leetcode - 1769. Minimum Number of Operations to Move All Balls to Each Box

Description

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.

Example 1:

Input: boxes = "110"
Output: [1,1,3]
Explanation: The answer for each box is as follows:
1) First box: you will have to move one ball from the second box to the first box in one operation.
2) Second box: you will have to move one ball from the first box to the second box in one operation.
3) Third box: you will have to move one ball from the first box to the third box in two operations, and move one ball from the second box to the third box in one operation.

Example 2:

Input: boxes = "001011"
Output: [11,8,5,4,3,4]

Constraints:

n == boxes.length
1 <= n <= 2000
boxes[i] is either '0' or '1'.

Solution

Brute Force

Iterate once to get all the indexes of balls, then iterate again to calculate: ∑ ∣ ball_index − i ∣ \sum |\text{ball\_index} - i| ∑∣ball_index−i∣

Time complexity: o ( n 2 ) o(n^2) o(n2)

Space complexity: o ( n ) o(n) o(n)

Prefix sum

Like 238. Product of Array Except Self, we can have left_cnt to denote the number of balls at the left of the current index, when moving one step forward, we have an extra left_cnt cost to move all the balls. We could do the same for right_cnt, and the final result would be left_cost + right_cost.

Time complexity: o ( n ) o(n) o(n)

Space complexity: o ( 1 ) o(1) o(1)

Code

Brute Force

python3 复制代码
class Solution:
    def minOperations(self, boxes: str) -> List[int]:
        ball_indexes = []
        for i in range(len(boxes)):
            if boxes[i] == '1':
                ball_indexes.append(i)
        res = []
        for i in range(len(boxes)):
            cur_res = 0
            for each_ball_index in ball_indexes:
                cur_res += abs(each_ball_index - i)
            res.append(cur_res)
        return res

Prefix sum

python3 复制代码
class Solution:
    def minOperations(self, boxes: str) -> List[int]:
        res = [0] * len(boxes)
        left_cnt = 0
        left_cost = 0
        for i in range(1, len(boxes)):
            if boxes[i - 1] == '1':
                left_cnt += 1
            left_cost += left_cnt
            res[i] += left_cost
        right_cnt = 0
        right_cost = 0
        for i in range(len(boxes) - 2, -1, -1):
            if boxes[i + 1] == '1':
                right_cnt += 1
            right_cost += right_cnt
            res[i] += right_cost
        return res
相关推荐
RAN_PAND23 分钟前
STL介绍1:vector、pair、string、queue、map
开发语言·c++·算法
fai厅的秃头姐!3 小时前
C语言03
c语言·数据结构·算法
lisanndesu3 小时前
动态规划
算法·动态规划
myprogramc3 小时前
十大排序算法
数据结构·算法·排序算法
记得早睡~3 小时前
leetcode150-逆波兰表达式求值
javascript·算法·leetcode
修己xj3 小时前
算法系列之贪心算法
算法
qy发大财3 小时前
跳跃游戏(力扣55)
算法·leetcode
BingLin-Liu3 小时前
蓝桥杯备考:搜索算法之排列问题
算法·职场和发展·蓝桥杯
计算机小白一个3 小时前
蓝桥杯 Java B 组之岛屿数量、二叉树路径和(区分DFS与回溯)
java·数据结构·算法·蓝桥杯
curemoon4 小时前
理解都远正态分布中指数项的精度矩阵(协方差逆矩阵)
人工智能·算法·矩阵