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

思路分析

  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),取决于排序实现)
相关推荐
小Ti客栈1 天前
Spring Boot 集成 Springdoc-OpenAPI 与 Knife4j实现接口文档与可视化调试
java·spring boot·后端
徐小夕1 天前
花了一周,3亿tokens,我开源了一款 Word 文档智能审查平台,文稿自动质检+可视化分析,告别低效人工审核
前端·算法·github
Ai拆代码的曹操1 天前
Spring 事务 REQUIRES_NEW 嵌套调用:连接池翻倍的秘密
java·后端·spring
动恰客流统计1 天前
ReID边缘计算视觉统计:餐饮店客流增长的数字化破局路径
java·大数据·运维·人工智能
可编程芯片开发1 天前
UPFC统一潮流控制器的simulink建模与仿真
算法
Ivanqhz1 天前
Rust &‘static str浅析
java·前端·javascript·rust
小小仙子1 天前
矢量网络分析仪如何测试S参数的?
人工智能·算法·机器学习
中微极客1 天前
降维算法75倍加速:从PCA到稀疏字典学习的工程实践
人工智能·学习·算法
storyseek1 天前
前缀和实现Kogge-Stone算法
数据结构·算法