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^51 <= price[i] <= 10^92 <= 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