思路分析
- 先对药水数组排序,为二分查找打基础;
- 对每个咒语,计算出满足条件的「最小药水值」;
- 用二分查找快速找到这个最小药水值在排序后数组中的位置;
- 位置之后的所有药水都满足条件,用 "数组长度 - 位置" 得到符合条件的数量。
代码实现
对二分法不太了解的小伙伴可以看下这篇文章二分查找进阶指南:从 "找一个数" 到 "锁定左右边界",逻辑因果与代码实现全解析
java
public int[] successfulPairs(int[] spells, int[] potions, long success) {
// 定义返回数据
int[] res = new int[spells.length];
// 对potions排序
Arrays.sort(potions);
// 遍历spells 数组,计算满足条件的potions 数量
for (int i = 0; i < spells.length; i++) {
// 计算满足 spell * potions[j] >= success 的最小j, 其中 j 为下标
long target = (spells[i] + success - 1) / spells[i];
int j = binarySearch(potions, target);
// 计算满足条件的potions 数量
int curNum = potions.length - j;
res[i] = curNum;
}
// 返回
return res;
}
/**
* @Author Feng
* @Description 二分查找,查找第一个大于等于target的下标
* @Date 2026/1/17
* @Param [nums, target]
* @return int
**/
public int binarySearch(int[] nums, long target){
int left = 0, right = nums.length;
while (left < right){
int mid = left +(right - left)/2;
if (nums[mid] == target){
right = mid;
} else if(nums[mid] < target){
left = mid + 1;
} else{
right = mid;
}
}
return left;
}
复杂度分析
- 时间复杂度:O (m logm + n logm)
- 空间复杂度:O (logm)(或 O (m),取决于排序实现)