力扣第 80 场双周赛:6096. 咒语和药水的成功对数

题目: 6096. 咒语和药水的成功对数
给你两个正整数数组 spells 和 potions ,长度分别为 n 和 m ,其中 spells[i] 表示第 i 个咒语的能量强度,potions[j] 表示第 j 瓶药水的能量强度。

同时给你一个整数 success 。一个咒语和药水的能量强度 相乘 如果 大于等于 success ,那么它们视为一对 成功 的组合。

请你返回一个长度为 n 的整数数组 pairs,其中 pairs[i] 是能跟第 i 个咒语成功组合的 药水 数目。

示例1:
力扣第 80 场双周赛:6096. 咒语和药水的成功对数_第1张图片
示例2:
力扣第 80 场双周赛:6096. 咒语和药水的成功对数_第2张图片
提示:

n == spells.length
m == potions.length
1 <= n, m <= 105
1 <= spells[i], potions[i] <= 105
1 <= success <= 1010

题目分析:
先将药水从小到大排序,然后使用二分查找第一个药水使其和咒语乘积大于等于success即可。
这里可以使用STL中的库函数二分upper_bound

class Solution {
public:
    int findright(vector<int> &num,int n,long long success)
    {
        int l=0,r=num.size()-1;
        while(l<r)
        {
            int mid=l+(r-l)/2;
            if((long long)num[mid]*n<success)l=mid+1;
            else r=mid;
        }
        if(l==num.size()-1&&(long long)num[l]*n<success)return l+1;
        return l;
    }
    vector<int> successfulPairs(vector<int>& spells, vector<int>& potions, long long success) {
        vector<int> res;
        sort(potions.begin(),potions.end());
        for(auto it:spells)
        {
            int k=findright(potions,it,success);
            res.push_back(potions.size()-k);
        }
        return res;
    }
};
class Solution {
public:
    vector<int> successfulPairs(vector<int>& spells, vector<int>& potions, long long success) {
        sort(potions.begin(),potions.end());
        for(auto &it:spells)
        {
            int k=potions.end()-upper_bound(potions.begin(),potions.end(),(success-1)/it);
            it=k;
        }
        return spells;
    }
};

你可能感兴趣的:(力扣周赛,leetcode,算法,二分)