前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >LeetCode 825. 适龄的朋友(计数排序+前缀和)

LeetCode 825. 适龄的朋友(计数排序+前缀和)

作者头像
Michael阿明
发布2021-02-19 15:29:51
发布2021-02-19 15:29:51
50300
代码可运行
举报
运行总次数:0
代码可运行

文章目录

1. 题目

人们会互相发送好友请求,现在给定一个包含有他们年龄的数组,ages[i] 表示第 i 个人的年龄。

当满足以下任一条件时,A 不能给 B(A、B不为同一人)发送好友请求:

  • age[B] <= 0.5 * age[A] + 7
  • age[B] > age[A]
  • age[B] > 100 && age[A] < 100

否则,A 可以给 B 发送好友请求。

注意如果 A 向 B 发出了请求,不等于 B 也一定会向 A 发出请求。 而且,人们不会给自己发送好友请求。

求总共会发出多少份好友请求?

代码语言:javascript
代码运行次数:0
复制
示例 1:
输入:[16,16]
输出:2
解释:二人可以互发好友申请。

示例 2:
输入:[16,17,18]
输出:2
解释:好友请求可产生于 17 -> 16, 18 -> 17.

示例 3:
输入:[20,30,100,110,120]
输出:3
解释:好友请求可产生于 110 -> 100, 120 -> 110, 120 -> 100.
 
提示:
1 <= ages.length <= 20000.
1 <= ages[i] <= 120.

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/friends-of-appropriate-ages 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

  • 根据条件,只有从15岁开始才可以发送申请
  • 先计数排序,并计算前缀人数和
  • 每个年龄段的人分成两部分:给自己小的年龄的人发,同龄人互发
代码语言:javascript
代码运行次数:0
复制
class Solution {
public:
    int numFriendRequests(vector<int>& ages) {
        vector<int> age(121, 0);//每个年龄有多少人
        for(auto a : ages) 
            age[a]++;
        vector<int> sum(121,0);
        for(int i = 1; i <= 120; i++)
        {
            sum[i] += sum[i-1]+age[i];// 前缀人数和
        }
        int ans = 0, l, r;
        for(int i = 15; i <= 120; i++)
        {
            l = i/2 + 7;
            r = i;
            ans += (sum[r-1]-sum[l])*age[i]+age[i]*(age[i]-1);
            //  年龄小于当前的,满足条件的人* 每人都可以发
            //  + 当前同龄里的人,互相发,排列 An2
        }
        return ans;
    }
};

84 ms 28.6 MB

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/09/30 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 1. 题目
  • 2. 解题
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档