在求最小值中的最大值或最大值的最小值时,往往采用二分解决,这道题二分的对象就是甜蜜度。在二分之前首先对price进行升序排序,在二分初始化中:left=0,right=price[n-1]-price[0],mid=(left+right+1)/2,然后在left和right中搜索最大甜蜜值。
check中:因为此题给定k,所以要在price中找到k个值满足相邻两个价格>=mid,首先以第一个price为基准向后查找第一个差值>=mid的价格,找到后计数+1,再以此price为基准向后查找,最后判断cnt和k的关系,cnt<k即不满足,甜蜜、度大了;cnt>=k即满足,此mid可能为最大甜蜜度。
二分中:如果不满足:说明甜蜜度大了,right=mid-1,缩小甜蜜度区间寻找
如果满足:说明此时甜蜜度有可能是最大的,保存此时甜蜜度到ans中,left=mid,扩大甜蜜度区间寻找。
class Solution {
public:
int maximumTastiness(vector<int>& price, int k) {
sort(price.begin(),price.end());
int l=price.size();
int left=0;
int right=price[l-1]-price[0];
int ans=0;
while(left<right)
{
int mid=(left+right+1)/2;
if(check(price,k,mid))
{
ans=mid;
left=mid;
}
else
{
right=mid-1;
}
}
return ans;
}
bool check(vector<int>& price, int k,int mid)
{
int pre=price[0];
int cnt=1;
for(int i=1;i<price.size();i++)
{
if(price[i]-pre>=mid)
{
cnt++;
pre=price[i];
}
}
return cnt>=k;
}
};
在很多数据面临组合时,从数据去推答案显然不是很好的选择,可以通过答案去找数据,再使用二分提高找答案的效率。