二分法的边界条件 2517. 礼盒的最大甜蜜度

文章介绍了一个寻找礼盒最大甜蜜度的问题,其中涉及到对糖果价格数组的排序和使用二分查找技术。在二分查找过程中,文章详细讨论了边界条件,特别是当左边界`i`和右边界`j`如何更新以确保找到满足条件的最小差值。同时,文中还指出在某些情况下,简单的向下取整平均值可能不适用,需要更精确的计算方法。
摘要由CSDN通过智能技术生成
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=mid1 没有问题,但是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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值