2300.咒语和药水的成功对数

​​题目来源:

        leetcode题目,网址:2300. 咒语和药水的成功对数 - 力扣(LeetCode)

解题思路:

       将 potions 数组排序后二分查找能够满足要求的最小值即可。

解题代码:

class Solution {
public:
    vector<int> successfulPairs(vector<int>& spells, vector<int>& potions, long long success) {
        vector<int> res;
        sort(potions.begin(),potions.end());
        for(int i=0;i<spells.size();i++){
            long minPotion=success/spells[i]+(success%spells[i]==0?0:1);
            res.push_back(getNum(potions,minPotion));
        }
        return res;
    }
    int getNum(vector<int>& potions,long minPotion){
        int start=0;
        int end=potions.size()-1;
        if(potions[start]>=minPotion){
            return end-start+1;
        }
        start++;
        while(start<=end){
            int mid=start+(end-start)/2;
            if(potions[mid]>=minPotion && potions[mid-1]<minPotion){
                return potions.size()-mid;
            }else if(potions[mid]>=minPotion){
                end=mid-1;
            }else{
                start=mid+1;
            }
        }
        return 0;
    }
};

总结:

        注意边界条件。

        官方题解给出了两种 解法。第一种是二分。第二种双指针,是将两个数组都排序后使用双指针查找,然后再按原来的顺序输出。

        C++ upper_bound(begin,end,num) 从数组的begin 位置到 end-1 位置二分查找第一个大于num 的数字。

        C++ lower_bound(begin,end,num) 从数组的begin 位置到 end-1 位置二分查找第一个小于等于 num 的数字。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值