目录链接:
力扣编程题-解法汇总_分享+记录-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;
}
};