news 2026/9/9 12:29:52

二分查找(九)2300. 咒语和药水的成功对数

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
二分查找(九)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] 。

整体思路较为清楚,遍历每一份spells,利用这个spell来进行与potions每个元素乘积结果的判断,使用二分搜索优化,找到第一个大于等于target的位置,后续直接用个数-位置即可

class Solution { public: int lower_bound(int spell, vector<int>& potions, long long target) { int left = 0, right = potions.size()-1; while(left <= right) { int mid = left + (right-left)/2; // long long temp = potions[mid] * spell; // if(potions[mid] < target/spell) if (1LL * potions[mid] * spell < target) left = mid + 1; else right = mid - 1; } return left; } vector<int> successfulPairs(vector<int>& spells, vector<int>& potions, long long success) { int n = spells.size(), m = potions.size(); vector<int> res(n); sort(potions.begin(), potions.end()); for(int i = 0; i < n; i++) { int index = lower_bound(spells[i], potions, success); res[i] = m - index; } return res; } };

主要问题是记录一下long long型元素的结果溢出

以下错误写法:由于potions和spell元素都是int类型,所以他们会先进行相乘,但结果已经超过他们的存储范围了,这时候再用longlong来接收就已经晚了

方案A:使用1LL

long long temp = 1LL * potions[mid] * spell;

方案B:使用显示类型转换

long long temp =static_cast<long long>(potions[mid]) * spell;

int lower_bound(int spell, vector<int>& potions, long long target) { int left = 0, right = potions.size()-1; while(left <= right) { int mid = left + (right-left)/2; long long temp = potions[mid] * spell; if (potions[mid] * spell < target) left = mid + 1; else right = mid - 1; } return left; }

还有就是把乘法转化为除法的形式:

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/8 5:15:48

数字员工与AI销冠系统是什么?主要具备哪些提升商业效率的优势?

数字员工在现代企业中扮演着至关重要的角色&#xff0c;能够有效优化业务流程&#xff0c;降低运营成本&#xff0c;并提升整体效率。这种智能化工具通过自动化执行大量重复性任务&#xff0c;如客户沟通和数据处理&#xff0c;让企业从繁琐事务中解放出来&#xff0c;从而专注…

作者头像 李华
网站建设 2026/9/8 5:17:11

枚举类型 enum:让常量更具语义化

枚举类型 enum&#xff1a;让常量更具语义化 在 C 编程中&#xff0c;常量的使用贯穿始终——无论是表示状态、类型、选项还是固定值&#xff0c;常量都是代码逻辑的重要组成部分。直接使用字面量&#xff08;如 0、1、2&#xff09;定义常量&#xff0c;虽能实现功能&#xf…

作者头像 李华
网站建设 2026/9/7 20:09:35

追踪一片茶叶的区块链之旅:智能合约开发全流程实战解析

引言&#xff1a;当区块链遇见供应链&#xff0c;一场静默的产业革命正在发生2023年&#xff0c;全球供应链危机持续发酵。从欧洲能源短缺引发的工业停摆&#xff0c;到东南亚农产品滞销导致的农民破产&#xff0c;传统供应链的脆弱性暴露无遗。而在这场危机中&#xff0c;一个…

作者头像 李华
网站建设 2026/9/5 14:29:39

告别 “从零摸索”:Java 企业 AI 开发的核心逻辑

在AI技术重塑行业格局的浪潮中&#xff0c;Java作为企业级开发的中坚力量&#xff0c;其技术生态如何与人工智能深度融合&#xff0c;成为Java企业转型的核心命题。对于深耕Java技术的团队而言&#xff0c;AI开发的关键并非抛弃成熟技术积累&#xff0c;而是找到适配Java生态的…

作者头像 李华