中位数定理-2448. 使数组相等的最小开销

问题描述

给你两个下标从 0 开始的数组 nums 和 cost ,分别包含 n 个 正 整数。
你可以执行下面操作 任意 次:
将 nums 中 任意 元素增加或者减小 1 。
对第 i 个元素执行一次操作的开销是 cost[i] 。
请你返回使 nums 中所有元素 相等 的 最少 总开销。

示例 1:
输入:nums = [1,3,5,2], cost = [2,3,1,14]
输出:8
解释:我们可以执行以下操作使所有元素变为 2 :

  • 增加第 0 个元素 1 次,开销为 2 。
  • 减小第 1 个元素 1 次,开销为 3 。
  • 减小第 2 个元素 3 次,开销为 1 + 1 + 1 = 3 。
    总开销为 2 + 3 + 3 = 8 。
    这是最小开销。

示例 2:
输入:nums = [2,2,2,2,2], cost = [4,2,8,1,3]
输出:0
解释:数组中所有元素已经全部相等,不需要执行额外的操作。
 
提示:
n == nums.length == cost.length
1 <= n <= 105
1 <= nums[i], cost[i] <= 106

问题求解

  • 简化问题
    如果给一个数组,每次调整cost = 1,那么怎么调整总的cost最低呢?
    答案就是选择中位数。
  • 原问题
    可以将cost转化为个数,那么就等价于上述的问题,因此只需要求扩展后的中位数即可。
class Solution:
    def minCost(self, nums: List[int], cost: List[int]) -> int:
        record = sorted(zip(nums, cost))
        mid = sum(cost) // 2 + 1
        cnt = 0
        for num, c in record:
            cnt += c
            if cnt >= mid: return sum([abs(x - num) * y for x, y in record])

`
posted @ 2022-10-28 18:55  hyserendipity  阅读(96)  评论(0编辑  收藏  举报