来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/friends-of-appropriate-ages
【题目描述】
在社交媒体网站上有 n 个用户。给你一个整数数组 ages ,其中 ages[i] 是第 i 个用户的年龄。
如果下述任意一个条件为真,那么用户 x 将不会向用户 y(x != y)发送好友请求:
- age[y] <= 0.5 * age[x] + 7
- age[y] > age[x]
- age[y] > 100 && age[x] < 100
否则,x 将会向 y 发送一条好友请求。
注意,如果 x 向 y 发送一条好友请求,y 不必也向 x 发送一条好友请求。另外,用户不会向自己发送好友请求。
返回在该社交媒体网站上产生的好友请求总数。
【示例】
示例 1:
输入:ages = [16,16]
输出:2
解释:2 人互发好友请求。
示例 2:
输入:ages = [16,17,18]
输出:2
解释:产生的好友请求为 17 -> 16 ,18 -> 17 。
示例 3:
输入:ages = [20,30,100,110,120]
输出:3
解释:产生的好友请求为 110 -> 100 ,120 -> 110 ,120 -> 100 。
提示:
- n == ages.length
- 1 <= n <= 2 * 104
- 1 <= ages[i] <= 120
【解题思路】
根据题目信息可知,发送好友请求的关键是用户x
和用户y
的年龄,即不满足题目中三个条件中的任意一个。因为人数n
的取值范围是[1, 20000]
,而年龄的取值范围是[1, 120]
,也就是说可能会有很多个人对应同一个年龄,且解题关键是年龄信息,所以计算时要以年龄为主,不能以人为主,不然很容易出现超时的情况。
- 使用
set
函数获取ages
中出现的年龄集合,用age_set
表示 - 用字典
age_dict
记录每个年龄对应的人数 - 判断
x,y
是否满足题目中的三个条件中的任意一个(x, y ∈age_dict),若为否,好友请求次数count += age_dict[x]*age_dict[y]
- 因为用户不会向自己发送好友请求,而上述计算方法却对其进行了计算,所以当满足发送好友请求的条件时,还要减去用户向自己发送好友请求的次数
【代码提交】
class Solution:
def numFriendRequests(self, ages: List[int]) -> int:
age_set = set(ages) # 获取年龄集合
age_dict = {i:(ages.count(i)) for i in age_set} # 获取每个年龄对应的人数
count = 0
for x in age_set:
for y in age_set:
# 满足发送好友请求的条件
if ((y<=0.5*x+7) or (y>x) or (y>100 and x<100)) is False:
count += age_dict[x]*age_dict[y]
# 减去用户向自己发送好友请求的次数
if x==y:
count -= age_dict[x]
return count
【运行结果】