2023.6.1每日一题

 在求最小值中的最大值或最大值的最小值时,往往采用二分解决,这道题二分的对象就是甜蜜度。在二分之前首先对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;
    }
};

        在很多数据面临组合时,从数据去推答案显然不是很好的选择,可以通过答案去找数据,再使用二分提高找答案的效率。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值