题目描述
示例
解题思路
问题很简单,在一个数组中找统计两个数相加是2的幂的组数
难点在于如何在十万个数的数组中找到合适的两个数
-
第一点也是比较容易想到的点,通过哈希表将记录每种美味度相同的餐品数量,这样可以略微缩小目标数组的大小
-
将不同美味度记录在数组中,并排序。这样做的目的是方便我们逆序遍历数组,这样可以避免因顺序不同而导致的重复
-
根据a+b=c,c-a=b的原理直接在哈希表中查询是否有目标,首先划定上限 两倍的当前数取2的对数+1,划定下限 一倍的当前数取2的对数,当然要转换为整型。然后遍历上限和下限之间的整数,根据不断变化的c,使用c-a去找b
-
找到b后记得两个哈希表的值相乘
-
当一个数的两倍恰好也是2的幂且餐品数量大于1,也是我们需要记录的,需要在程序中加判断。
代码
Python实现
import math
class Solution:
def countPairs(self, deliciousness: List[int]) -> int:
hasmap = dict()
for i in deliciousness:
if i not in hasmap:
hasmap[i] = 1
else:
hasmap[i] += 1
answer=0
l=sorted(list(hasmap.keys()))
for i in range(len(l)-1,-1,-1):
if l[i]>0:
Max=int(math.log(l[i]*2,2))+1
Min=int(math.log(l[i],2))
for j in range(Min,Max+1):
temp=2**j-l[i]
if temp in hasmap and temp!=l[i] and temp<l[i]:
answer += hasmap[l[i]] * hasmap[temp]
if l[i] != 0:
if math.log(2 * l[i], 2) % 1 == 0:
answer += (hasmap[l[i]] * (hasmap[l[i]] - 1) // 2)
return answer%(10**9+7)
不足之处欢迎在评论区指出