栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

2021.12.27 力扣-每日一题-适龄的朋友

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

2021.12.27 力扣-每日一题-适龄的朋友

题目描述:

在社交媒体网站上有 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 发送一条好友请求。另外,用户不会向自己发送好友请求。

返回在该社交媒体网站上产生的好友请求总数。

样例:

方法一:

class Solution {
public:
    int numFriendRequests(vector& ages) {
        int cnt[121] = {0};     //cnt[i]表示年龄为i的人数
        for (int i = 0; i < ages.size(); i++)
        {
            cnt[ages[i]]++;
        }
        int pre[121] = {0};     //pre[i]表示年龄小于等于i的人数
        for (int i = 1; i <= 120; i++)
        {
            pre[i] = pre[i - 1] + cnt[i];
        }
        int ans = 0;
        for (int i = 15; i <= 120; i++)
        {
            if (cnt[i])
            {
                int minage = 0.5 * i + 7;
                //对于每个年龄为i的人,他会向pre[i] - pre[minage] - 1个人发送好友请求,其中包括年龄等于他的人,减一是要排除自己
                ans += cnt[i] * (pre[i] - pre[minage] - 1);
            }
        }
        return ans;
    }
};

看完多个题解后,发现还是这种方法最方便,由于年龄只限定在1到120之间,所以可以直接开两个数组,一个cnt[i]用于记录年龄为i的人数,一个pre[i]用于记录年龄小于等于i的人数。

由题目可知,对于每个年龄为age的人来说,其能够向以下年龄范围内的人发送好友请求:

                                                ( 0.5 * age + 7, age】

所以即是pre[i] - pre[minage] - 1,减一是因为自己不能够向自己发送好友请求。

另外当0.5 * age + 7 >= age,即age <= 14 时,此区间将不存在,即年龄小于等于14的人不能发送任何的好友请求,所以不必考虑年龄小于等于14的人。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/683669.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号