【六月更文打卡】2517. 礼盒的最大甜蜜度

201 阅读1分钟

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 。

提示:

  • 1 <= price.length <= 10^5
  • 1 <= price[i] <= 10^9
  • 2 <= k <= price.length

解题思路:二分答案

对答案进行二分 先确定二分的区间(也就是答案的取值范围)[0, max(price) - min(price)]

对于猜的答案ans,验证是猜大了还是猜小了 将猜的答案ans作为已知量,以此去判断最多能选多少个数

为了不漏选,用到了贪心的思想 将数组从小到大进行排序,从最小的数开始选起,用count记录已经选了多少个数 对于每个选的数price[i],他们之间的差值的绝对值要大于等于猜的答案 即|price[i] - price[j]| >= ans(就是要满足题目条件)

class Solution:
    def maximumTastiness(self, price: List[int], k: int) -> int:
        price.sort()
        n = len(price)
        def check(x):
            t = price[0]
            for i in range(k - 1):
                p = bisect_left(price, t + x)
                if p >= n: return False
                t = price[p]
            return True
​
        left, right = 0, max(price)
        while left <= right:
            mid = (left + right ) // 2
            if check(mid):
                left = mid + 1
            else:
                right = mid - 1
                
        return right