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 = 1
            for p in price:
                if p - pre >= num:    # 任意两个相邻所选糖果的差值都至少为 mid
                    cnt += 1
                    pre = p    # 上一个选择糖果的价格
            return cnt    # 返回已选糖果种类

        price.sort()
        left = 0
        right = (price[-1] - price[0]) // (k - 1) + 1
        while left + 1 < right:
            mid = (left + right) // 2
            if check(mid) >= k:    # 种类大于等于k类,满足,找更大的甜蜜度
                left = mid
            else:    # 种类大于等于k类,不满足,找更小的甜蜜度
                right = mid
        return left

复杂度分析

作者:灵茶山艾府
链接:https://leetcode.cn/problems/maximum-tastiness-of-candy-basket/solutions/2031994/er-fen-da-an-by-endlesscheng-r418/
来源:力扣(LeetCode)

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值