1.题目基本信息
1.1.题目描述
给你两个正整数数组 spells 和 potions ,长度分别为 n 和 m ,其中 spells[i] 表示第 i 个咒语的能量强度,potions[j] 表示第 j 瓶药水的能量强度。
同时给你一个整数 success 。一个咒语和药水的能量强度 相乘 如果 大于等于 success ,那么它们视为一对 成功 的组合。
请你返回一个长度为 n 的整数数组 pairs,其中 pairs[i] 是能跟第 i 个咒语成功组合的 药水 数目。
1.2.题目地址
https://leetcode.cn/problems/successful-pairs-of-spells-and-potions/description/
2.解题方法
2.1.解题思路
从spells中遍历每一个魔法spell,并用二分法从升序排列后的potions中找到第一个potions[i]+spell >= success的i,len(potions)-i即为返回数组对应魔法的成功组合数
2.2.解题步骤
第一步,将药水数组进行升序排列
第二步,遍历spells,对每个spell,使用二分法获取第一个potions[i]+spell >= success的i,对应的spell的成功组合数即为len(potions)-i,将结果一项一项添加到结果数组中,最后返回结果数组。
3.解题代码
Python代码
class Solution:
def successfulPairs(self, spells: List[int], potions: List[int], success: int) -> List[int]:
# 从spells中遍历每一个魔法spell,并用二分法从升序排列后的potions中找到第一个potions[i]+spell >= success的i,len(potions)-i即为返回数组对应魔法的成功组合数
# 第一步,将药水数组进行升序排列
# 第二步,遍历spells,对每个spell,使用二分法获取第一个potions[i]+spell >= success的i,对应的spell的成功组合数即为len(potions)-i,将结果一项一项添加到结果数组中,最后返回结果数组。
potions.sort()
result=[0]*len(spells)
for i in range(len(spells)):
# 红:potions[i]+spell<success,蓝:potions[i]+spell>=success;找到第一个蓝
left,right=0,len(potions)
while left<right:
mid=(right-left)//2+left
if spells[i]*potions[mid]<success:
left=mid+1
else:
right=mid
result[i]=len(potions)-right
# print(result)
return result