825.适龄的朋友
【LetMeFly】825.适龄的朋友:双指针(排序nlog n) 或 桶排序(n + C^2)
力扣题目链接:https://leetcode.cn/problems/friends-of-appropriate-ages/
在社交媒体网站上有 n
个用户。给你一个整数数组 ages
,其中 ages[i]
是第 i
个用户的年龄。
如果下述任意一个条件为真,那么用户 x
将不会向用户 y
(x != y
)发送好友请求:
ages[y] <= 0.5 * ages[x] + 7
ages[y] > ages[x]
ages[y] > 100 && ages[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
方法一:双指针
如果满足第三条ages[y] > 100 && ages[x] < 100
,那么一定满足第二条ages[y] > ages[x]
,因此第三条可以忽略(只要满足第二条,不需要看是否满足第三条就一定不会受到邀请)。
由第一条和第二条可知,当y
满足0.5x+7 < y <= x
时y
才会收到来自x
的邀请。由0.5x+7 < x
可得只有>= 15
的x
才会有可能发送邀请。
对于邀请发送者x
,y
的最小值需要满足y > 0.5x+7
,y
的最大值需要满足y <= x
。
假设y_l
是第一个满足> 0.5x+7
的y
下标,y_r
是最后一个满足<= x
的y
下标,那么对于区间[y_l, y_r]
,只有x
自身不会收到x
的邀请,其他用户都会收到x
的邀请。因此x
的邀请发送数量为区间长度 - 1 = y_r - y_l
。
不难发现随着x
的非递减,y
区间的左右端点y_l
和y_r
也是非递减的,因此就可以使用双指针来实现每个元素只被遍历数次。
- 时间复杂度$O(n\log n)$:排序时间复杂度$O(n\log n)$,双指针时间复杂度$O(n)$
- 空间复杂度$O(\log n)$
AC代码
C++
1 |
|
方法二:桶排序
有没有一种办法避免方法一的时间瓶颈——排序呢?当然有。
不难发现每个人的年龄范围是1
到120
,因此我们只需要统计一下每个年龄段分别有多少人,再枚举x
和y
的年龄判定是否符合第一第二两个条件就好了。
- 时间复杂度$O(n + C^2)$:其中$C=120$
- 空间复杂度$O(C)$
AC代码
C++
1 |
|
同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/143836115