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

思路分析

  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),取决于排序实现)
相关推荐
董董灿是个攻城狮1 天前
AI视觉连载8:传统 CV 之边缘检测
算法
怒放吧德德1 天前
Netty 4.2 入门指南:从概念到第一个程序
java·后端·netty
雨中飘荡的记忆1 天前
大流量下库存扣减的数据库瓶颈:Redis分片缓存解决方案
java·redis·后端
心之语歌1 天前
基于注解+拦截器的API动态路由实现方案
java·后端
华仔啊2 天前
Stream 代码越写越难看?JDFrame 让 Java 逻辑回归优雅
java·后端
ray_liang2 天前
用六边形架构与整洁架构对比是伪命题?
java·架构
AI软著研究员2 天前
程序员必看:软著不是“面子工程”,是代码的“法律保险”
算法
FunnySaltyFish2 天前
什么?Compose 把 GapBuffer 换成了 LinkBuffer?
算法·kotlin·android jetpack
Ray Liang2 天前
用六边形架构与整洁架构对比是伪命题?
java·python·c#·架构设计
颜酱2 天前
理解二叉树最近公共祖先(LCA):从基础到变种解析
javascript·后端·算法