力扣2517. 礼盒的最大甜蜜度

这一题的大意是给出一个数组,表示每一种糖果的价格,现在希望我们能找到k个不同种类的礼盒,每一个礼盒由两个不同种类的糖果组成,礼盒的甜蜜度则是由这两类糖果的价格之差决定,现在让我们找到最大的甜蜜度,k个种类的礼盒的甜蜜度是所有礼盒甜蜜度中的最小值。
很明显的最大化最小值,用二分答案。
我们假设k个礼盒最大的甜蜜度为x,那么去验证这个x是否是最大的
先对糖果的价格进行排序,这样方便找最大的最小甜蜜度
为啥非要进行排序?
因为如果不排序,那么找任意两个糖果的价格差值只能暴力枚举,很明显会超时
而排序后,我们就可以贪心地想,从最小的价格开始,更容易找到差值最大的两类糖果。
只需要这样写check函数:
我们只需要从左到右遍历,如果出现两种糖果的差是大于x,那么说明cnt++,如果在遍历完之后,有cnt》=k,也就是有超过k个糖果都是大于等于x,那么就会有两种情况:
一种是有存在等于x的,那么恰好是符合假设的,还有一种可能是所有的甜蜜度都是大于x,那么仍然返回true,继续去二分逼近甜蜜度的最大值。
如果cnt<k,那么说明,是存在甜蜜度比x小的,那么最大的最小值就不可能是x,而是这个比x小的甜蜜度。
因此完整代码如下:
class Solution {
public:bool check(int x,vector<int>& price,int k){int pre=price[0];int cnt=1;for(int i=1;i<price.size();i++){if(price[i]-pre>=x){cnt++;pre=price[i];}}if(cnt>=k){return true;}else{return false;}}int maximumTastiness(vector<int>& price, int k) {int l=0;int r=1e9;int ans=0;sort(price.begin(),price.end());while(l<=r){int mid=(l+r)/2;if(check(mid,price,k)){ans=max(ans,mid);l=mid+1;}else{r=mid-1;}} return ans;}
};
时间复杂度O(nlogn)
