LeetCode 分类刷题:2517. 礼盒的最大甜蜜度
题目
给你一个正整数数组 price
,其中 price[i]
表示第 i
类糖果的价格,另给你一个正整数 k
。
商店组合 k
类 不同 糖果打包成礼盒出售。礼盒的 甜蜜度 是礼盒中任意两种糖果 价格 绝对差的最小值。
返回礼盒的 最大 甜蜜度。
示例 1:
输入:price = [13,5,1,8,21,2], k = 3 输出:8 解释:选出价格分别为 [13,5,21] 的三类糖果。 礼盒的甜蜜度为 min(|13 - 5|, |13 - 21|, |5 - 21|) = min(8, 8, 16) = 8 。 可以证明能够取得的最大甜蜜度就是 8 。
示例 2:
输入:price = [1,3,1], k = 2 输出:2 解释:选出价格分别为 [1,3] 的两类糖果。 礼盒的甜蜜度为 min(|1 - 3|) = min(2) = 2 。 可以证明能够取得的最大甜蜜度就是 2 。
示例 3:
输入:price = [7,7,7,7], k = 2 输出:0 解释:从现有的糖果中任选两类糖果,甜蜜度都会是 0 。
解析
deepseek解析
灵神解答
「任意两种糖果价格绝对差的最小值」等价于「排序后,任意两种相邻糖果价格绝对差的最小值」。
如果题目要求「最大化最小值」或者「最小化最大值」,一般是二分答案。为什么?对于本题来说,甜蜜度越大,能选择的糖果越少,有单调性,所以可以二分答案。
定义 f(d) 表示甜蜜度至少为 d 时,最多能选多少类糖果。(注意是至少,不是恰好)
作者:灵茶山艾府
链接:https://leetcode.cn/problems/maximum-tastiness-of-candy-basket/solutions/2031994/er-fen-da-an-by-endlesscheng-r418/
来源:力扣(LeetCode)
答案
class Solution:def maximumTastiness(self, price: List[int], k: int) -> int:def check(num: int) -> int:pre = price[0] # 使用贪心策略,总是从最小的价格开始选cnt = 1for p in price:if p - pre >= num: # 任意两个相邻所选糖果的差值都至少为 midcnt += 1pre = p # 上一个选择糖果的价格return cnt # 返回已选糖果种类price.sort()left = 0right = (price[-1] - price[0]) // (k - 1) + 1while left + 1 < right:mid = (left + right) // 2if check(mid) >= k: # 种类大于等于k类,满足,找更大的甜蜜度left = midelse: # 种类大于等于k类,不满足,找更小的甜蜜度right = midreturn left
复杂度分析
作者:灵茶山艾府
链接:https://leetcode.cn/problems/maximum-tastiness-of-candy-basket/solutions/2031994/er-fen-da-an-by-endlesscheng-r418/
来源:力扣(LeetCode)