Leetcode 3139. Minimum Cost to Equalize Array

1. 解题思路

这一题是一道hard的题目,而且看了一下答出率低的离谱,就一开始被吓到了,不过实际做了一下之后,发现用很蠢的方法也一下子过了,就很懵逼……

首先,显然如果cost1的两倍不大于cost2,那么我们显然全部使用操作一加到最大值即可。

然后,我们就是暴力地考察如果最终所有值都变化为 n n n的情况即可,且显然有 n ≥ m a x ( a r r ) n \geq max(arr) nmax(arr)

而关于如何求将数组变为一个具体的n时的情况,此时我们只需要算出所有差值然后进行排序,如果最大值不多于总和的一半,那么我们总可以使用操作二来完成几乎所有的操作,至多只需要执行一次操作一;如果最大值多于综合的一半,那么我们就只能使用操作一来填平其中不够的部分了。

2. 代码实现

给出python代码实现如下:

MOD = 10**9+7

class Solution:
    def minCostToEqualizeArray(self, nums: List[int], cost1: int, cost2: int) -> int:
        if 2 * cost1 <= cost2:
            return (max(nums) * len(nums) - sum(nums)) * cost1 % MOD
        
        nums = sorted(nums)
        _max = max(nums)
        
        def cal_cost(tgt):
            delta = [tgt-x for x in nums]
            tot = sum(delta)
            if delta[0] <= (tot+1) // 2:
                return tot // 2 * cost2 + tot % 2 * cost1
            else:
                return (delta[0] - tot + delta[0]) * cost1 + (tot - delta[0]) * cost2
            
        ans = cal_cost(_max)
        while True:
            _max += 1
            _ans = cal_cost(_max)
            if _ans >= ans:
                break
            ans = _ans
        return ans % MOD

提交代码评测得到:耗时1841ms,占用内存31.5MB。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值