2517. 礼盒的最大甜蜜度
给你一个正整数数组 price ,其中 price[i] 表示第 i 类糖果的价格,另给你一个正整数 k 。
商店组合 k 类 不同 糖果打包成礼盒出售。礼盒的 甜蜜度 是礼盒中任意两种糖果 价格 绝对差的最小值。
返回礼盒的 最大 甜蜜度。
记录一下二分查找的时候几个边界条件
DEBUG = False
ITER = 100
class Solution:
def maximumTastiness(self, price: List[int], k: int) -> int:
sorted_price = sorted(price)
mean_tas = (sorted_price[-1] - sorted_price[0]) // (k - 1)
ans = mean_tas
i, j = 0 , mean_tas
iteration = 0
while i <= j:
mid = ((j - i) >> 1) + i
# if mid == i:
# mid += 1
if DEBUG:
print(i, j, (j-i)>>1, mid)
iteration += 1
if iteration > ITER:
print("Error")
raise IndexError
taken = []
flag = False
for itr in sorted_price:
if DEBUG:
print(taken, itr, mid)
# if taken:
# print(itr - taken[-1] > mid, itr - taken[-1])
if not taken:
taken.append(itr)
elif itr - taken[-1] >= mid:
taken.append(itr)
if len(taken) >= k:
flag = True
break
if DEBUG:
print(flag)
if flag:
i = mid + 1
else:
j = mid - 1
return j
一个是 whilewhilewhile 循环中是 leftleftleft 小于 rightrightright 还是小于等于,这个需要和
if flag:
i = mid + 1
else:
j = mid - 1
有对应关系,midmidmid 不满足时 j=mid−1j = mid - 1j=mid−1 没有问题,但是mid满足时如果 iii 要等于 mid+1mid + 1mid+1,就会出现 i=54,j=56i=54, j=56i=54,j=56,555555 可行从而直接结束的情况。
但是如果不 mid+1mid+1mid+1 就需要考虑 i=4,j=5i=4,j=5i=4,j=5 的情况,这种时候求均值的方法就不能向下取整。可以考虑 (i+j+1)>>1(i + j + 1) >> 1(i+j+1)>>1。