力扣-咒语和药水的成功对数

思路分析

  1. 先对药水数组排序,为二分查找打基础;
  2. 对每个咒语,计算出满足条件的「最小药水值」;
  3. 用二分查找快速找到这个最小药水值在排序后数组中的位置;
  4. 位置之后的所有药水都满足条件,用 "数组长度 - 位置" 得到符合条件的数量。

代码实现

对二分法不太了解的小伙伴可以看下这篇文章二分查找进阶指南:从 "找一个数" 到 "锁定左右边界",逻辑因果与代码实现全解析

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),取决于排序实现)
相关推荐
阿维的博客日记5 小时前
Hippo4j 线程池监控平台部署手册
java·spring boot·后端
南境十里·墨染春水6 小时前
C++ 工厂模式:从入门到进阶,彻底掌握对象创建的艺术
开发语言·c++·算法
@insist1236 小时前
系统架构设计师-实时性评价、调度算法与内核架构选型
算法·架构·系统架构·软考·系统架构设计师·软件水平考试
C+++Python7 小时前
详细介绍一下Java泛型的通配符
java·windows·python
JosieBook7 小时前
【数据库】时序预测能力的分级进化:TimechoAI如何让每一类用户都能精准预见未来
java·开发语言·数据库
一生了无挂8 小时前
Java处理JSON技巧教学(从基础到高阶实战全覆盖)
java·开发语言·json
李白的天不白9 小时前
使用 SmartAdmin 进行前后端开发
java·前端
swordbob9 小时前
Spring 单例 Bean 是线程安全的吗?
java·开发语言
2601_9516437710 小时前
Python第一,Java跌出前三,C语言杀回来了
java·c语言·python·编程语言排行·技术趋势