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

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

解题思路

  • 将potions进行排序
  • 遍历spells数组的每一个元素
  • 针对每一个spells元素 对potions进行二分查找
  • 二分查找找到的是第一个符合要求的数字 所以一定不是直接return mid
  • 找到的是left指向的数字
  • 计算长度 存储
class Solution {
    public int[] successfulPairs(int[] spells, int[] potions, long success) {
        // 创建结果数组
        // ArrayList list = new ArrayList<>();
        int[] pairs = new int[spells.length];
        Arrays.sort(potions);
        // 针对spells 的每一个元素 针对potions数组 进行二分查找其余的元素
        for(int i  = 0; i < spells.length; i++){
            int left = 0;
            int right = potions.length - 1;

            // 使用二分查找算法 找到第一个符合要求的数字即可 因为数组有序 剩下的数字
            // 一定符合要求

            
            // 修改二分查找算法
            while(left <= right){
                int mid = left + (right - left)/2;
                if(potions[mid]  >= (double)success / spells[i]){
                    right = mid - 1;
                    
                }else{
                    // 找到了大于的数字
                    left = mid + 1;
                }
            }

            // 上面循环的结束 一定是 right < left  left指向的是第一个符合要求的数字
            if(left < potions.length){
                pairs[i] = potions.length - left;
            }else{
                pairs[i]  = 0;
            }

        }

        return pairs;

    }
}

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