​LeetCode解法汇总2517. 礼盒的最大甜蜜度

目录链接:

力扣编程题-解法汇总_分享+记录-CSDN博客

GitHub同步刷题项目:

https://github.com/September26/java-algorithms

原题链接:力扣


描述:

给你一个正整数数组 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 <= 105
  • 1 <= price[i] <= 109
  • 2 <= k <= price.length

解题思路:

* 解题思路:
* 对数组进行排序,就可以知道两两之间的差值。
* 最大的差值就是price[price.length-1] - price[0]=right。最小的差值假设就是left。
* 求最大甜蜜度时,我们使用二分查找,首先尝试middle = (left + right)/2是否可行,
* 如果可行,则继续尝试首先尝试(middle+1+right)/2
* 如果不可行,则继续尝试(left+middle-1)/2

代码:

class Solution {
public:
    /**
 * 看sweetValue是否满足要求
 */
bool check(vector<int> &price, int k, int sweetValue)
{
    int leftIndex = 0;
    for (int i = 0; i < price.size(); i++)
    {
        int sum = price[i] - price[leftIndex];
        if (sum >= sweetValue)
        {
            leftIndex = i;
            k--;
        }
        if (k == 0)
        {
            return true;
        }
    }
    return false;
}

int maximumTastiness(vector<int> &price, int k)
{
    sort(price.begin(), price.begin() + price.size());
    int abs = 0;
    int left = 0;
    int right = price[price.size() - 1] - price[0];
    while (left <= right)
    {
        int middle = (left + right) / 2;
        if (check(price, k - 1, middle))
        {
            left = middle + 1;
            abs = middle;
        }
        else
        {
            right = middle - 1;
        }
    }
    return abs;
}
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

失落夏天

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值