2026/3/8 5:58:12
网站建设
项目流程
企业vi设计报价,seo顾问阿亮,招商加盟类网站模板,个人网站可以做推广吗2300. 咒语和药水的成功对数 给你两个正整数数组 spells 和 potions #xff0c;长度分别为 n 和 m #xff0c;其中 spells[i] 表示第 i 个咒语的能量强度#xff0c;potions[j] 表示第 j 瓶药水的能量强度。 同时给你一个整数 success 。一个咒语和药水的能量强度 相乘 如…2300. 咒语和药水的成功对数给你两个正整数数组spells和potions长度分别为n和m其中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, vectorint 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; } vectorint successfulPairs(vectorint spells, vectorint potions, long long success) { int n spells.size(), m potions.size(); vectorint 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使用1LLlong long temp 1LL * potions[mid] * spell;方案B使用显示类型转换long long temp static_castlong long(potions[mid]) * spell;int lower_bound(int spell, vectorint 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; }还有就是把乘法转化为除法的形式