目录

  • 题目截图
  • 题目分析
  • 第一版丑陋了考虑所有[minn, maxn]变化量
  • 第二版优雅只考虑给定点(猜结论)
  • 三分法学习
  • 总结

题目截图

题目分析

  • 由于暴力是平方不行
  • 这种题目可以考虑变化量,从最小到最大,于是有了我第一版的穷举最小到最大的考虑变化量(实际可以优化成给定点)
  • 优化成给定点又是另外一版
  • 三分求极值点学习

第一版丑陋了考虑所有[minn, maxn]变化量

class Solution:def minCost(self, nums: List[int], cost: List[int]) -> int:n = len(nums)minn, maxn = min(nums), max(nums)minnCost = 0for i in range(n):minnCost += abs(nums[i] - minn) * cost[i]ans = minnCost#print(minnCost)lst = [[nums[i], cost[i]] for i in range(n)]lst.sort()#print(lst)nums2 = [lst[i][0] for i in range(n)]ht = [0] * (10 ** 6 + 1)for num in nums:ht[num] += 1cost2 = [lst[i][1] for i in range(n)]#print(cost2)preSum = [0] * npreSum[0] = cost2[0]for i in range(1, n):preSum[i] = preSum[i - 1] + cost2[i]#print(preSum)cur = minnCostidx = 0for i in range(minn + 1, maxn + 1):#idx = bisect_left(nums2, i) - 1#print(idx)#print((preSum[-1] - preSum[idx]), preSum[idx])#print(cur)cur += -(preSum[-1] - preSum[idx]) + preSum[idx]#print(cur)if ht[i] >= 1:idx += ht[i]if cur < ans:ans = curreturn ans

第二版优雅只考虑给定点(猜结论)

class Solution:def minCost(self, nums: List[int], cost: List[int]) -> int:# 最小开销一定是在取某个nums[i]的时候得到(猜结论)# 给定初始量, 考虑变化量a = sorted(zip(nums, cost))# 从a[0][0]开始考虑ans = cur = sum([(x - a[0][0]) * c for x, c in a])sumCost = sum([c for _, c in a])# 考虑临近的两个(x, c)# 由x0 -> x1# + c * (x1 - x0)# - (sumCost - c) * (x1 - x0)# 汇总: - (sumCost - 2c) * (x1 - x0)for (x0, c), (x1, _) in pairwise(a):sumCost -= 2 * ccur -= sumCost * (x1 - x0)ans = min(ans, cur)return ans
  • 按照nums排序
  • 考虑总共的sumCost
  • 优雅pairwise取出两两相邻
  • 考虑临近的两个(x, c)
  • 由x0 -> x1
    • c * (x1 - x0)
    • (sumCost - c) * (x1 - x0)
  • 汇总: - (sumCost - 2c) * (x1 - x0)

三分法学习

class Solution:def minCost(self, nums: List[int], cost: List[int]) -> int:# 猜:因为有最小值,所以猜凸def fun(pos: int) -> int:return sum(abs((num - pos)) * c for num, c in zip(nums, cost))return minimize(fun, min(nums), max(nums))INF = int(4e18)def minimize(fun: Callable[[int], int], lower: int, upper: int) -> int:"""三分法求`严格凸函数fun`在`[lower,upper]`间的最小值"""res = INFwhile (upper - lower) >= 3:diff = upper - lowermid1 = lower + diff // 3mid2 = lower + 2 * diff // 3if fun(mid1) > fun(mid2):lower = mid1else:upper = mid2while lower <= upper:cand = fun(lower)res = cand if cand < res else reslower += 1return res
  • 为什么凸?因为有最小值,所以猜凸
  • 试试呗

总结

  • 经典考虑初始值 + 变化量 + 排序
  • 最小值考虑三分法凸函数模板

leetcode:2448. 使数组相等的最小开销【猜结论落在给定点 + 考虑初始值和变化量 + 三分法模板学习】相关推荐

  1. LeetCode 945. 使数组唯一的最小增量

    945. 使数组唯一的最小增量 思路:预留多一点空间给它:用哈希表计算有多少个相同的值 class Solution { public:int minIncrementForUnique(vector ...

  2. LeetCode 945. 使数组唯一的最小增量(贪心)

    1. 题目 给定整数数组 A,每次 move 操作将会选择任意 A[i],并将其递增 1. 返回使 A 中的每个值都是唯一的最少操作次数. 示例 1: 输入:[1,2,2] 输出:1 解释:经过一次 ...

  3. LeetCode 1551. 使数组中所有元素相等的最小操作数(等差数列)

    文章目录 1. 题目 2. 解题 1. 题目 存在一个长度为 n 的数组 arr ,其中 arr[i] = (2 * i) + 1 ( 0 <= i < n ). 一次操作中,你可以选出两 ...

  4. leetcode 5488. 使数组中所有元素相等的最小操作数(C++)

    存在一个长度为 n 的数组 arr ,其中 arr[i] = (2 * i) + 1 ( 0 <= i < n ). 一次操作中,你可以选出两个下标,记作 x 和 y ( 0 <= ...

  5. LeetCode 2144. 打折购买糖果的最小开销(贪心)

    文章目录 1. 题目 2. 解题 1. 题目 一家商店正在打折销售糖果.每购买 两个 糖果,商店会 免费 送一个糖果. 免费送的糖果唯一的限制是:它的价格需要小于等于购买的两个糖果价格的 较小值 . ...

  6. LeetCode 1674. 使数组互补的最少操作次数(差分思想)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个长度为 偶数 n 的整数数组 nums 和一个整数 limit . 每一次操作,你可以将 nums 中的任何整数替换为 1 到 limit 之间的 ...

  7. Java实现 LeetCode 801 使序列递增的最小交换次数 (DP)

    801. 使序列递增的最小交换次数 我们有两个长度相等且不为空的整型数组 A 和 B . 我们可以交换 A[i] 和 B[i] 的元素.注意这两个元素在各自的序列中应该处于相同的位置. 在交换过一些元 ...

  8. LeetCode 1887. 使数组元素相等的减少操作次数(map)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个整数数组 nums ,你的目标是令 nums 中的所有元素相等.完成一次减少操作需要遵照下面的几个步骤: 找出 nums 中的 最大 值.记这个值 ...

  9. LeetCode 1187. 使数组严格递增(DP)*

    文章目录 1. 题目 2. 解题 1. 题目 给你两个整数数组 arr1 和 arr2,返回使 arr1 严格递增所需要的最小「操作」数(可能为 0). 每一步「操作」中,你可以分别从 arr1 和 ...

最新文章

  1. IOS逆向【2】-cydia之开发者模式
  2. java 文件流读取文本_如何在Java 8中处理流和读取文本文件
  3. 刷卡提示57能恢复吗_硬盘格式化之后数据还能恢复吗?
  4. 【调试工具】之IOS真机测试
  5. [JPA] javax.persistence.EntityNotFoundException: Unable to find XXXX with id 0
  6. 计算机科学梦想演讲稿,关于科技演讲稿讲话稿范文三篇
  7. openpose学习
  8. 用友u8怎么导出凭证_用友U8V10.1ERP怎么生成期间损益结转凭证的图文操作教程
  9. python cv2 利用掩膜将图片透明背景
  10. Android10支持dcip3,dcip3 相当于多少srgb
  11. 创翼软件linux版本,电信创翼客户端下载
  12. LCP 03 机器人大冒险(分析-计算运动周期)
  13. 记录mysql中如何统计日周月季度年
  14. Address already in use: JVM_Bind:8080 关于XXX端口被占用问题的解决
  15. 从pdf复制文字到word中的问题
  16. html5情人节贺卡,情人节贺卡祝福语
  17. AndroidID、IMEI、OAID获取
  18. C语言程序设计入门——平均值
  19. WebSphere MQ应急预案
  20. SCVMM 2012 SP1 Beta 体验(一)安装准备

热门文章

  1. Tomcat 启动闪退问题
  2. hibernate Criteria setProjection
  3. Flutter中ListView顶部有空白
  4. C# 提取Word文档中的图片(用Spire)
  5. MATLAB repmat函数的使用
  6. 数据挖掘#金融风控总结
  7. Hexo+NexT 如何取消下划线
  8. Roblox剑九之剑二
  9. 铣床是什么?怎么分类
  10. matlab定义双精度型变量_matlab双精度浮点数编码及区间覆盖(原创)