leetcode:2448. 使数组相等的最小开销【猜结论落在给定点 + 考虑初始值和变化量 + 三分法模板学习】
目录
- 题目截图
- 题目分析
- 第一版丑陋了考虑所有[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. 使数组相等的最小开销【猜结论落在给定点 + 考虑初始值和变化量 + 三分法模板学习】相关推荐
- LeetCode 945. 使数组唯一的最小增量
945. 使数组唯一的最小增量 思路:预留多一点空间给它:用哈希表计算有多少个相同的值 class Solution { public:int minIncrementForUnique(vector ...
- LeetCode 945. 使数组唯一的最小增量(贪心)
1. 题目 给定整数数组 A,每次 move 操作将会选择任意 A[i],并将其递增 1. 返回使 A 中的每个值都是唯一的最少操作次数. 示例 1: 输入:[1,2,2] 输出:1 解释:经过一次 ...
- LeetCode 1551. 使数组中所有元素相等的最小操作数(等差数列)
文章目录 1. 题目 2. 解题 1. 题目 存在一个长度为 n 的数组 arr ,其中 arr[i] = (2 * i) + 1 ( 0 <= i < n ). 一次操作中,你可以选出两 ...
- leetcode 5488. 使数组中所有元素相等的最小操作数(C++)
存在一个长度为 n 的数组 arr ,其中 arr[i] = (2 * i) + 1 ( 0 <= i < n ). 一次操作中,你可以选出两个下标,记作 x 和 y ( 0 <= ...
- LeetCode 2144. 打折购买糖果的最小开销(贪心)
文章目录 1. 题目 2. 解题 1. 题目 一家商店正在打折销售糖果.每购买 两个 糖果,商店会 免费 送一个糖果. 免费送的糖果唯一的限制是:它的价格需要小于等于购买的两个糖果价格的 较小值 . ...
- LeetCode 1674. 使数组互补的最少操作次数(差分思想)
文章目录 1. 题目 2. 解题 1. 题目 给你一个长度为 偶数 n 的整数数组 nums 和一个整数 limit . 每一次操作,你可以将 nums 中的任何整数替换为 1 到 limit 之间的 ...
- Java实现 LeetCode 801 使序列递增的最小交换次数 (DP)
801. 使序列递增的最小交换次数 我们有两个长度相等且不为空的整型数组 A 和 B . 我们可以交换 A[i] 和 B[i] 的元素.注意这两个元素在各自的序列中应该处于相同的位置. 在交换过一些元 ...
- LeetCode 1887. 使数组元素相等的减少操作次数(map)
文章目录 1. 题目 2. 解题 1. 题目 给你一个整数数组 nums ,你的目标是令 nums 中的所有元素相等.完成一次减少操作需要遵照下面的几个步骤: 找出 nums 中的 最大 值.记这个值 ...
- LeetCode 1187. 使数组严格递增(DP)*
文章目录 1. 题目 2. 解题 1. 题目 给你两个整数数组 arr1 和 arr2,返回使 arr1 严格递增所需要的最小「操作」数(可能为 0). 每一步「操作」中,你可以分别从 arr1 和 ...
最新文章
- IOS逆向【2】-cydia之开发者模式
- java 文件流读取文本_如何在Java 8中处理流和读取文本文件
- 刷卡提示57能恢复吗_硬盘格式化之后数据还能恢复吗?
- 【调试工具】之IOS真机测试
- [JPA] javax.persistence.EntityNotFoundException: Unable to find XXXX with id 0
- 计算机科学梦想演讲稿,关于科技演讲稿讲话稿范文三篇
- openpose学习
- 用友u8怎么导出凭证_用友U8V10.1ERP怎么生成期间损益结转凭证的图文操作教程
- python cv2 利用掩膜将图片透明背景
- Android10支持dcip3,dcip3 相当于多少srgb
- 创翼软件linux版本,电信创翼客户端下载
- LCP 03 机器人大冒险(分析-计算运动周期)
- 记录mysql中如何统计日周月季度年
- Address already in use: JVM_Bind:8080 关于XXX端口被占用问题的解决
- 从pdf复制文字到word中的问题
- html5情人节贺卡,情人节贺卡祝福语
- AndroidID、IMEI、OAID获取
- C语言程序设计入门——平均值
- WebSphere MQ应急预案
- SCVMM 2012 SP1 Beta 体验(一)安装准备