1711.大餐计数
🍽 1711.大餐计数
大餐 是指 恰好包含两道不同餐品 的一餐,其美味程度之和等于 2 的幂。
你可以搭配 任意 两道餐品做一顿大餐。
给你一个整数数组 deliciousness
,其中 deliciousness[i]
是第 i
道餐品的美味程度,返回你可以用数组中的餐品做出的不同 大餐 的数量。结果需要对 10000000007
取余。
注意,只要餐品下标不同,就可以认为是不同的餐品,即便它们的美味程度相同。
思路
基本思想
按照读题之后的第一想法,首先就是求出所有的组合情况,然后依次判断每一个组合的和是不是2的幂并且最终的结果对 10000000007
取余即可,求出所有的组合数可以使用回溯法,判断和是不是2的幂可以使用位运算,所以最终的代码为:
|
|
但是这种代码只能解决一部分案例,数字过多时会超时,主要体现在如果出现[1,3,3,3,3]
这种情况时,每一个3都会与1进行配对从而逐步计算出结果,这是耗时的地方,所以需要改进计算组合的情况
为了计算出所有与当前数相加的和是2的幂的所有数,我们需要一个容器记录所有出现的数字,并且为了记录所有数字出现的次数,我们选择使用哈希表
整体的流程就是遍历给定的数组中的所有元素,针对每一个元素去哈希表中找哪个元素与其相加是哪个2的幂,其中2的幂代表0,2,4,8,16...
,这种元素有几个,最终的结果数就加几次。需要注意的是,判断是哪个2的幂时需要有一个终点,不然就会陷入死循环
给定一个数组一定会存在一个最大值,数组中任意两个数的和相加肯定不会超过这个最大值的二倍,所以我们可以以这个最大值的二倍当成2的幂的终点,然后判断哈希表中哪些元素可以相加出现哪些2的幂
执行流程
- 找到数组中的最大值的二倍当成2的幂的终点,数组中两个数的最大值不可能超过这个数
- 针对每一个元素,判断当前元素与哈希表中哪些元素可以相加得到2的幂中的任意一个
- 这种元素有几个,结果数就加几,然后与
1000000007
取余 - 返回最终的结果
代码
根据以上分析,得出以下代码:
|
|
核心就是在统计完每个数都能组成哪些2的幂之后,然后将其加入到哈希表中
总结
从直观的角度解决问题之后,然后发现会有重复的元素会被使用,所以使用哈希表来保存遍历到的数,便于后期直接使用,并且一旦组成了一个哈希表之后,后期的元素可以直接使用sum-deliciousness[i]
得到当前有几个数可以与deliciousness[i]
组成2的幂,并不用一遍一遍的去统计,这样就大大减少了时间