思路
题目的要求就是,将数组每一个元素都乘上一个数,然后判断数组中的元素是否是大于target
的,如何统计有多少个数是满足条件的,当然可以进行遍历去寻找,还有一种更容易想到的方法就是,如果当前数组是有序的话,只要找到第一个大于等于target
的数,那么该数后面的数字一定也是符合条件的。
做法就是先将potions
进行排序,然后利用二分查找找到第一个符合条件的数。
如果题目中没有符合条件的数,在二分查找完成后进行判断就可以规避。
如果符合,那么直接计算数即可。
主要本题的数据范围,在二分查找的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;
}
}