Tips:该专栏的题解整理在https://github.com/dzw001/leetcode_notebook,有需要的童鞋自取哦~
题目链接
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 ~ 120 之间,因此可以先统计出每个年龄的人数,然后对于其中的任意一个年龄 x
,计算出其 会发送交友请求的年龄范围 ,然后计算这个年龄范围内的人数之和 n
,则 x * (n - 1)
即为所有 年龄为 x
的人 所发出的好友请求的总数。
之所以减一是因为根据题目中的限制条件可以算出,年龄相同的人 也在交友范围内,因此 自己 也在交友范围内,但自己是不能向自己发出好友请求的。
# Python3
class Solution:
def numFriendRequests(self, ages: List[int]) -> int:
request_num = 0
record = [0] * 121
for age in ages:
record[age] += 1
for i in range(1, 121):
# 计算年龄为 i 的用户的交友年龄上下界
min_age = i / 2 + 7
if int(min_age) == min_age:
min_age += 1
else:
min_age += 0.5
max_age = i
# 计算年龄为 i 的用户总共能产生的请求数量
if min_age > max_age:
continue
request_num += record[i] * (sum(record[int(min_age): max_age + 1]) - 1)
return request_num
max_age + 1]) - 1)
return request_num