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
一个是 w h i l e while while 循环中是 l e f t left left 小于 r i g h t right right 还是小于等于,这个需要和
if flag:
i = mid + 1
else:
j = mid - 1
有对应关系,
m
i
d
mid
mid 不满足时
j
=
m
i
d
−
1
j = mid - 1
j=mid−1 没有问题,但是mid满足时如果
i
i
i 要等于
m
i
d
+
1
mid + 1
mid+1,就会出现
i
=
54
,
j
=
56
i=54, j=56
i=54,j=56,
55
55
55 可行从而直接结束的情况。
但是如果不
m
i
d
+
1
mid+1
mid+1 就需要考虑
i
=
4
,
j
=
5
i=4,j=5
i=4,j=5 的情况,这种时候求均值的方法就不能向下取整。可以考虑
(
i
+
j
+
1
)
>
>
1
(i + j + 1) >> 1
(i+j+1)>>1。