2517. 礼盒的最大甜蜜度

225 阅读1分钟

题目:
给你一个正整数数组 price ,其中 price[i] 表示第 i 类糖果的价格,另给你一个正整数 k 。

商店组合 k 类 不同 糖果打包成礼盒出售。礼盒的 甜蜜度 是礼盒中任意两种糖果 价格 绝对差的最小值。

返回礼盒的 最大 甜蜜度
算法:
方法一:二分+贪心
思路:求最大值是吧,我先猜一个最大值为x,看能不能取到k个数,然后根据猜大了,猜小了继续猜。
怎么计算x能否取到k个数呢,根据贪心思想,将prices排序,先取小的prices,这样才能取到尽可能多的k个数

func maximumTastiness(price []int, k int) int {
    sort.Ints(price)
    var check func(tastiness int) bool
    // 是否可以找到甜蜜度为tastiness的糖果组合
    check = func(tastiness int) bool {
        count := 1
        j := 0
        for i := range price {
            if price[i] - price[j] >= tastiness {
                j = i
                count ++
                if count >= k {
                    break
                }
            }
        }
        return count >= k
    } 

    left, right := 0, price[len(price) - 1] - price[0]
    for left < right {
        // 因为我们(left + right) / 2求mid是向left取整,而check(mid)==true时left不变,
        // left + 1 = right 时就会陷入死循环,这种情况写作left + right + 1,
        // 以后要注意二分的left不变的情况下,注意考虑上面的死循环边界情况

        mid := (left + right + 1) / 2
        if check(mid) {
            left = mid
        } else {
            right = mid - 1
        }

    }
    return left
}