0825. 适龄的朋友
大约 3 分钟
---
0825. 适龄的朋友
- 标签:数组、双指针、二分查找、排序
- 难度:中等
题目链接
题目大意
描述:
在社交媒体网站上有 个用户。给你一个整数数组 ,其中 是第 个用户的年龄。
如果下述任意一个条件为真,那么用户 将不会向用户 ()发送好友请求:
- ages[y] > 100 && ages[x] < 100
否则, 将会向 发送一条好友请求。
注意,如果 向 发送一条好友请求, 不必也向 发送一条好友请求。另外,用户不会向自己发送好友请求。
要求:
返回在该社交媒体网站上产生的好友请求总数。
说明:
- 。
- 。
- 。
示例:
- 示例 1:
输入:ages = [16,16]
输出:2
解释:2 人互发好友请求。- 示例 2:
输入:ages = [16,17,18]
输出:2
解释:产生的好友请求为 17 -> 16 ,18 -> 17 。解题思路
思路 1:计数 + 数学
这道题要求计算好友请求的总数。根据题意,用户 不会向用户 发送好友请求的条件是:
- 且
反过来, 会向 发送好友请求的条件是:
由于年龄范围只有 到 ,我们可以使用计数数组来统计每个年龄的人数,然后枚举所有可能的年龄对。
算法步骤:
- 使用计数数组 统计每个年龄的人数。
- 枚举所有可能的年龄对 。
- 如果满足发送好友请求的条件,累加请求数:
- 如果 ,则请求数为 (同年龄的人互相发送,但不向自己发送)。
- 如果 ,则请求数为 。
思路 1:代码
class Solution:
def numFriendRequests(self, ages: List[int]) -> int:
# 统计每个年龄的人数
count = [0] * 121
for age in ages:
count[age] += 1
result = 0
# 枚举所有可能的年龄对
for ageX in range(1, 121):
if count[ageX] == 0:
continue
for ageY in range(1, 121):
if count[ageY] == 0:
continue
# 判断 x 是否会向 y 发送好友请求
if ageY <= 0.5 * ageX + 7:
continue
if ageY > ageX:
continue
if ageY > 100 and ageX < 100:
continue
# 累加请求数
if ageX == ageY:
result += count[ageX] * (count[ageX] - 1)
else:
result += count[ageX] * count[ageY]
return result思路 1:复杂度分析
- 时间复杂度:,其中 是数组 的长度, 是年龄的范围。需要遍历数组统计年龄,然后枚举所有年龄对。
- 空间复杂度:,需要使用计数数组存储每个年龄的人数。