LeetCode刷题NO.825——适龄的朋友

13 篇文章 0 订阅
12 篇文章 0 订阅

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/friends-of-appropriate-ages

【题目描述】

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

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

【示例】
示例 1:

输入:ages = [16,16]
输出:2
解释:2 人互发好友请求。

示例 2:

输入:ages = [16,17,18]
输出:2
解释:产生的好友请求为 17 -> 1618 -> 17

示例 3:

输入:ages = [20,30,100,110,120]
输出:3
解释:产生的好友请求为 110 -> 100120 -> 110120 -> 100

提示:

  • n == ages.length
  • 1 <= n <= 2 * 104
  • 1 <= ages[i] <= 120

【解题思路】

根据题目信息可知,发送好友请求的关键是用户x和用户y的年龄,即不满足题目中三个条件中的任意一个。因为人数n的取值范围是[1, 20000],而年龄的取值范围是[1, 120],也就是说可能会有很多个人对应同一个年龄,且解题关键是年龄信息,所以计算时要以年龄为主,不能以人为主,不然很容易出现超时的情况。

  1. 使用set函数获取ages中出现的年龄集合,用age_set表示
  2. 用字典age_dict记录每个年龄对应的人数
  3. 判断x,y是否满足题目中的三个条件中的任意一个(x, y ∈age_dict),若为否,好友请求次数count += age_dict[x]*age_dict[y]
  4. 因为用户不会向自己发送好友请求,而上述计算方法却对其进行了计算,所以当满足发送好友请求的条件时,还要减去用户向自己发送好友请求的次数

【代码提交】

class Solution:
    def numFriendRequests(self, ages: List[int]) -> int:
        age_set = set(ages)  # 获取年龄集合
        age_dict = {i:(ages.count(i)) for i in age_set}  # 获取每个年龄对应的人数
        count = 0
        for x in age_set:
            for y in age_set:
            	# 满足发送好友请求的条件
                if ((y<=0.5*x+7) or (y>x) or (y>100 and x<100)) is False:
                    count += age_dict[x]*age_dict[y]
                    
                    # 减去用户向自己发送好友请求的次数
                    if x==y:
                        count -= age_dict[x]
        return count

【运行结果】
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值