news 2026/4/16 13:33:31

二分查找(九)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/4/14 6:54:55

基于Java Swing的讯飞实时语音转写开发实践

前言语音识别技术在实时通信、会议记录、语音助手等场景中有着广泛应用。本文将介绍如何使用Java Swing开发一个完整的桌面级实时语音转写工具&#xff0c;集成讯飞开放平台的ASR&#xff08;自动语音识别&#xff09;服务。该工具支持麦克风实时录音和音频文件转写两种模式&am…

作者头像 李华
网站建设 2026/4/3 21:57:26

学长亲荐8个AI论文网站,助你轻松搞定本科毕业论文!

学长亲荐8个AI论文网站&#xff0c;助你轻松搞定本科毕业论文&#xff01; AI工具助你轻松应对论文难题 在本科毕业论文写作过程中&#xff0c;许多同学都面临着内容构思困难、格式不规范、重复率过高等问题。随着AI技术的不断发展&#xff0c;越来越多的AI工具开始被应用于学…

作者头像 李华
网站建设 2026/4/11 18:57:30

Java毕设项目推荐-基于SpringBoot + Vue的“校园购”二手交易平台基于SpringBoot的高校跳蚤市场交易系统【附源码+文档,调试定制服务】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/4/13 21:01:35

如何成为一名黑客?小白必学的11个基本步骤,从零基础入门到精通,看完这一篇就够了!

前言 黑客攻防是一个极具魅力的技术领域&#xff0c;但成为一名黑客毫无疑问也并不容易。你必须拥有对新技术的好奇心和积极的学习态度&#xff0c;具备很深的计算机系统、编程语言和操作系统知识&#xff0c;并乐意不断地去学习和进步。 如果你想成为一名优秀的黑客&#xf…

作者头像 李华
网站建设 2026/4/10 21:51:59

全网最全专科生AI论文平台TOP8测评

全网最全专科生AI论文平台TOP8测评 2026年专科生AI论文写作平台测评&#xff1a;为何选择这些工具&#xff1f; 随着人工智能技术的不断发展&#xff0c;越来越多的专科生开始借助AI论文写作平台来提升学习效率和论文质量。然而&#xff0c;面对市场上琳琅满目的工具&#xff0…

作者头像 李华