力扣每日一题(二十二——适龄的朋友)

仅以此纪录每日LeetCode所刷题目

 

题目描述:

示例:

思路:

这道题首先想到了暴力迭代法,很快的写出来,果不其然超时了。观察取值范围之后,我发现年龄是0-120岁,相对比较少,因此我们可以使用哈希表来存储每个年龄岁对应的人数。之后我们将哈希表的key值从大到小排序,因为题目中说年龄小的人不会像年龄大的人发送好友请求,所以这样排序可以减少循环的次数。之后我们开始遍历key值,如果说一个年龄有很多人,那他们会相互的发送好友请求(我们从示例一可以看你出),假设某个年龄有n个人,那么他们之间会互相发送n*(n-1)个好友请求,但是这里面有特殊情况。根据age[y] <= 0.5 * age[x] + 7来判断,15岁以下的人不会交朋友,哪怕是相同年龄的也不行,因此我们要判断年龄是否大于15岁。之后我们开始不同年龄发送请求,只要满足题目要求的。假如a年龄有m个人,b年龄有n个人,那他们一共会发送m*n个好友请求。之后返回所有的好友请求即可。

代码:

class Solution:
    def numFriendRequests(self, ages: List[int]) -> int:
        dict = {}
        count = 0
        for i in range(len(ages)):
            if ages[i] in dict:
                dict[ages[i]] += 1
            else:
                dict[ages[i]] = 1
        list1 = sorted(dict.keys(),reverse = True)
        for i in range(len(list1)):
            if dict.get(list1[i]) > 1 and list1[i] > 14:
                count += (dict.get(list1[i]))*(dict.get(list1[i])-1)
            if i != (len(list1)-1):
                for j in range(i+1,len(list1)):
                    if (list1[i]*0.5+7) < list1[j]:
                        count += dict.get(list1[i])*dict.get(list1[j])
        return count

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值