大餐计数(时间复杂度)-------leetcode每日一题

题目描述

在这里插入图片描述

示例

在这里插入图片描述

解题思路

问题很简单,在一个数组中找统计两个数相加是2的幂的组数

难点在于如何在十万个数的数组中找到合适的两个数
在这里插入图片描述

  1. 第一点也是比较容易想到的点,通过哈希表将记录每种美味度相同的餐品数量,这样可以略微缩小目标数组的大小

  2. 将不同美味度记录在数组中,并排序。这样做的目的是方便我们逆序遍历数组,这样可以避免因顺序不同而导致的重复

  3. 根据a+b=c,c-a=b的原理直接在哈希表中查询是否有目标,首先划定上限 两倍的当前数取2的对数+1,划定下限 一倍的当前数取2的对数,当然要转换为整型。然后遍历上限和下限之间的整数,根据不断变化的c,使用c-a去找b

  4. 找到b后记得两个哈希表的值相乘

  5. 当一个数的两倍恰好也是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)

在这里插入图片描述

不足之处欢迎在评论区指出

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值