夯实算法-41.适龄的朋友

145 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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 -> 100120 -> 110120 -> 100

  提示:

  • n==ages.lengthn == ages.length
  • 1<=n<=21041 <= n <= 2 * 10^4
  • 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;// 返回 所有人 发送好友请求的信息条数。
}

运行结果

Snipaste_2022-10-22_23-16-40.png

复杂度分析

  • 时间复杂度:O(n)O(n)
  • 空间复杂度:O(n)O(n)

掘金(JUEJIN)  一起分享知识, Keep Learning!