Skip to content
Blogster on GitHub Dinesh on Twitter

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

链接

思路

题目的要求就是,将数组每一个元素都乘上一个数,然后判断数组中的元素是否是大于target的,如何统计有多少个数是满足条件的,当然可以进行遍历去寻找,还有一种更容易想到的方法就是,如果当前数组是有序的话,只要找到第一个大于等于target的数,那么该数后面的数字一定也是符合条件的。

做法就是先将potions进行排序,然后利用二分查找找到第一个符合条件的数。

  1. 如果题目中没有符合条件的数,在二分查找完成后进行判断就可以规避。

  2. 如果符合,那么直接计算数即可。

主要本题的数据范围,在二分查找的check函数中,需要* 1L进行long转化

代码

class Solution {
    public int[] successfulPairs(int[] spells, int[] potions, long target) {

        Arrays.sort(potions);

        int n = potions.length - 1;
        int[] ans = new int[spells.length];

        for (int i = 0; i < spells.length; i++) {
            int l = 0;
            int r = n;
            while (l < r) {
                int mid = (l + r) >> 1;
                if (potions[mid] * 1L * spells[i] >= target) r = mid;
                else l = mid + 1;
            }

            if (potions[l] * 1L * spells[i] >= target) ans[i] = n - l + 1;
            else ans[i] = 0;
        }

        return ans;
    }

}