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

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

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

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


复杂度:O(N*logN)
思路:对potions进行排序,遍历spellls,使用二分查找,找到符合条件的索引。

class Solution {
    public int[] successfulPairs(int[] spells, int[] potions, long success) {
        int n = spells.length;
        int m = potions.length;
        int[] ans = new int[n];

        // 对potions进行排序
        Arrays.sort(potions);


        for(int i=0; i<n; i++) {
            int l=0, r=m-1;
            double cur = 1.0*success/spells[i];
            
            // 二分查找
            while(l<r) {
                int mid = (l+r)>>1;
                if(potions[mid]>=cur) r = mid;
                else l = mid+1;
            }
            if(1L*potions[r]*spells[i]>=success) ans[i] = m-r;
        }

        return ans;
    }
}

你可能感兴趣的:(算法,数据结构,排序算法)