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

思路分析

  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),取决于排序实现)
相关推荐
Loo国昌2 小时前
【LangChain1.0】第一篇:基础认知
后端·python·算法·语言模型·prompt
H Corey2 小时前
Java--面向对象之继承与多态
java·开发语言·windows·学习·算法·intellij-idea
ejinxian2 小时前
2026 年 Java 开发计划-Oracle公布
java·开发语言·java 开发计划
Sylvia-girl2 小时前
Java之日志框架
java·开发语言
MengFly_2 小时前
Java广播 —如何利用广播做服务发现
java·网络·服务发现
永远都不秃头的程序员(互关)2 小时前
【K-Means深度探索(三)】告别“初始陷阱”:K-Means++优化质心初始化全解析!
算法·机器学习·kmeans
zqmattack2 小时前
SQL sever根据身份证判断性别函数
java·数据库·sql
Macbethad2 小时前
半导体EFEM设备TwinCAT程序设计方案
java·前端·网络
程序员-King.2 小时前
day136—快慢指针—重排链表(LeetCode-143)
算法·leetcode·链表·快慢指针