超级洗衣机

题目描述

题目链接:517. 超级洗衣机

假设有 n 台超级洗衣机放在同一排上。开始的时候,每台洗衣机内可能有一定量的衣服,也可能是空的。
在每一步操作中,你可以选择任意 m (1 <= m <= n) 台洗衣机,与此同时将每台洗衣机的一件衣服送到相邻的一台洗衣机。
给定一个整数数组 machines 代表从左至右每台洗衣机中的衣物数量,请给出能让所有洗衣机中剩下的衣物的数量相等的 最少的操作步数 。如果不能使每台洗衣机中衣物的数量相等,则返回 -1。

思路

遍历每个位置,每个位置的最小操作次数瓶由该位置左右两段的应摊的衣物数量和实际的衣物数量决定,这里分两种情况:

  • 左右两段的应摊衣物数量都大于实际的衣物数量,说明需要从当前位置向左右两段移送,由于每次只能操作一件衣物,所以操作次数应为,leftRest + rightRest;
  • 不满足第一种条件,说明当前位置既要接收衣物,又要移送衣物,因此操作次数应为max(leftRest, rightRest);

代码描述

class SuperWashingMachines:
    """
    超级洗衣机问题
    https://leetcode.cn/problems/super-washing-machines/

    """
    def solution(self, arr):
        """

        :param arr:
        :return:
        """
        if not arr:
            return 0
        sum_arr = sum(arr)
        n_arr = len(arr)
        if sum_arr % n_arr != 0:
            return -1
        avg = sum_arr/n_arr
        left_sum = 0
        ans = 0
        for i in range(n_arr):
            leftRest = left_sum - i * avg
            rightRest = (sum_arr - left_sum - arr[i]) - (n_arr-i-1) * avg
            if leftRest < 0 and rightRest < 0:
                ans = max(ans, abs(leftRest) + abs(rightRest))
            else:
                ans = max(ans, max(abs(leftRest), abs(rightRest)))

            left_sum += arr[i]

        return ans

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

NLP_wendi

谢谢您的支持。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值