今天第一眼瞅这道题发现不会,没有思路,然后再评论区,看到一个让我觉得需要记录下来的话:
最大的最小或者是最小的最大要二分。
题目具体描述如下:
给你一个正整数数组 price ,其中 price[i] 表示第 i 类糖果的价格,另给你一个正整数 k 。商店组合 k 类 不同 糖果打包成礼盒出售。礼盒的 甜蜜度 是礼盒中任意两种糖果 价格 绝对差的最小值。返回礼盒的 最大 甜蜜度。
输入:
price = [13,5,1,8,21,2], k = 3
输出:
8
这道题是要二分答案,也就是甜蜜度;然后根据甜蜜度,找到此时能组合的糖果类别count,和k比较;如果count>=k,那就说明甜蜜度还可以继续增大,否则,甜蜜度就得减小。
这个题需要注意的一个点就是二分计算mid的时候,left+right直接相加可能存在溢出问题,可以通过 left+(right - left)/ 2优化;同时为优化计算时间,可以将/2操作变成>>1。
具体代码如下:
class Solution {
public:
int maximumTastiness(vector<int>& price, int k) {
sort(price.begin(),price.end());
int n = price.size();
int left = 0;
int right = price[n-1] - price[0];
int mid ;
int result;
while(left <= right)
{
mid = left + ( (right - left) >> 1);
//cout<<mid<<endl;
int first = price[0];
int count = 1;
for(int i = 1;i < n;i++)
{
if(price[i] - first >= mid)
{
count++;
first = price[i];
}
}
if(count >= k)
{
left = mid + 1;
result = mid;
}
else
{
right = mid - 1;
}
}
return result;
}
};