• LC-2300. 咒语和药水的成功对数(排序+贪心、排序+二分)


    2300. 咒语和药水的成功对数

    中等

    给你两个正整数数组 spellspotions ,长度分别为 nm ,其中 spells[i] 表示第 i咒语的能量强度,potions[j] 表示第 j药水的能量强度。

    同时给你一个整数 success 。一个咒语和药水的能量强度 相乘 如果 大于等于 success ,那么它们视为一对 成功 的组合。

    请你返回一个长度为 n 的整数数组 pairs,其中 pairs[i] 是能跟第 i 个咒语成功组合的 药水 数目。

    示例 1:

    输入:spells = [5,1,3], potions = [1,2,3,4,5], success = 7
    输出:[4,0,3]
    解释:
    - 第 0 个咒语:5 * [1,2,3,4,5] = [5,10,15,20,25] 。总共 4 个成功组合。
    - 第 1 个咒语:1 * [1,2,3,4,5] = [1,2,3,4,5] 。总共 0 个成功组合。
    - 第 2 个咒语:3 * [1,2,3,4,5] = [3,6,9,12,15] 。总共 3 个成功组合。
    所以返回 [4,0,3] 。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    示例 2:

    输入:spells = [3,1,2], potions = [8,5,8], success = 16
    输出:[2,0,2]
    解释:
    - 第 0 个咒语:3 * [8,5,8] = [24,15,24] 。总共 2 个成功组合。
    - 第 1 个咒语:1 * [8,5,8] = [8,5,8] 。总共 0 个成功组合。
    - 第 2 个咒语:2 * [8,5,8] = [16,10,16] 。总共 2 个成功组合。
    所以返回 [2,0,2] 。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    提示:

    • n == spells.length
    • m == potions.length
    • 1 <= n, m <= 105
    • 1 <= spells[i], potions[i] <= 105
    • 1 <= success <= 1010

    排序 + 贪心

    class Solution {
        /**
        存在两个变量通常是固定一个枚举另一个
        从大到小枚举 spell,
        对potions从小到大排序,维护变量cur 表示potions[cur]
        那么 spell * potions[cur] 只会越来越小
         */
        public int[] successfulPairs(int[] spells, int[] potions, long success) {
            int n = spells.length, m = potions.length;
            int[] res = new int[n];
            Arrays.sort(potions);
            Integer[] idxs = new Integer[n];
            for(int i = 0; i < n; i++) idxs[i] = i;
            Arrays.sort(idxs, (a, b) -> spells[b] - spells[a]);
            int cur = 0;
            for(int idx : idxs){
                int spell = spells[idx];
                while(cur < m && 1.0 * spell * potions[cur] < 1.0 * success)
                    cur += 1;
                res[idx] = m - cur;
            }
            return res;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    排序 + 二分

    class Solution {
        public int[] successfulPairs(int[] spells, int[] potions, long success) {
            int n = spells.length, m = potions.length;
            int[] ans = new int[n];
            Arrays.sort(potions);
            for(int i = 0; i < n; i++){
                // 二分找到第一个大于等于 cur 的值
                // cur表示和 spells 匹配的药水强度
                double cur = success * 1.0 / spells[i];
                int left = 0, right = m;
                while(left < right){
                    int mid = left + right >> 1;
                    if(potions[mid] < cur) left = mid + 1;
                    else right = mid;
                }
                ans[i] = m - right;
            }
            return ans;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
  • 相关阅读:
    前端新手Vue3+Vite+Ts+Pinia+Sass项目指北系列文章 —— 第三章 项目创建
    栈溢出原理
    ROS + vscode环境搭建
    【读书笔记】【Effective Modern C++】型别推导
    numpy函数总结
    2022年全球市场中性耐候硅酮密封胶总体规模、主要生产商、主要地区、产品和应用细分研究报告
    redis缓存三大问题及内存满了该怎么办
    综合工具-Design Compiler使用(从RTL到综合出各种报告timing\area\critical_path)
    springcloud_2021.0.3学习笔记:通过nacos客户端进行服务注册
    CUDA 学习记录
  • 原文地址:https://blog.csdn.net/qq_42958831/article/details/134333470