仅以此纪录每日LeetCode所刷题目
题目描述:
示例:
思路:
这道题首先想到了暴力迭代法,很快的写出来,果不其然超时了。观察取值范围之后,我发现年龄是0-120岁,相对比较少,因此我们可以使用哈希表来存储每个年龄岁对应的人数。之后我们将哈希表的key值从大到小排序,因为题目中说年龄小的人不会像年龄大的人发送好友请求,所以这样排序可以减少循环的次数。之后我们开始遍历key值,如果说一个年龄有很多人,那他们会相互的发送好友请求(我们从示例一可以看你出),假设某个年龄有n个人,那么他们之间会互相发送n*(n-1)个好友请求,但是这里面有特殊情况。根据来判断,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