持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第21天,点击查看活动详情
题目:LeetCode
在社交媒体网站上有 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 。
提示:
- 1 <= ages[i] <= 120
解题思路
将 数组ages 进行排序(升序),其实就是将这批人 按照年龄 从高到低 进行排序。
此时再使用 两个 “左右指针” 进行锁定 x 的交友范围。
确定好了之后,right - left 就是 符合 x 交友条件的人数,也就是题目中的 x 会向 y 发送请求。
代码实现
public int numFriendRequests(int[] ages) {
Arrays.sort(ages);
int n = ages.length;
int left = 0,right = 0,result=0;
for(int age : ages){
if( age < 15){
// 不考虑 15岁以下的,这是题目隐藏条件,你不信邪,就加上等于,或者删除这个代码块
continue;// 后面程序不执行,继续foreach 循环 读取数据。
}
while(ages[left] <= 0.5*age +7){// 太小的,不合适,left++,范围缩小
left++;
}
while(right+1 < n && ages[right+1] <= age){// 年龄合适
right++;
}
result += right -left;// 累计每个人 发出好友请求
}
return result;// 返回 所有人 发送好友请求的信息条数。
}
运行结果
复杂度分析
- 时间复杂度:
- 空间复杂度:
在掘金(JUEJIN) 一起分享知识, Keep Learning!