825. Friends Of Appropriate Ages

问题:

给定一个年龄数组,代表一组人的年龄,他们任何一个人A会向除了以下3个条件外的任意B发送好友请求,A->B

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

请问,一共可能发送多少请求。

Example 1:
Input: [16,16]
Output: 2
Explanation: 2 people friend request each other.

Example 2:
Input: [16,17,18]
Output: 2
Explanation: Friend requests are made 17 -> 16, 18 -> 17.

Example 3:
Input: [20,30,100,110,120]
Output: 
Explanation: Friend requests are made 110 -> 100, 120 -> 110, 120 -> 100.
 

Notes:
1 <= ages.length <= 20000.
1 <= ages[i] <= 120.

  

解法:

从除外条件,反推满足条件:

1<=age[A]<=120 1<=age[B]<=120

A会找比他小或同岁,且不能太小(>0.5*age[A]+7)的B

而第三个条件,已经被以上条件涵盖。

A发请求的满足条件的情况为:0.5*age[A]+7 < age[B] <= age[A]

由上述age[A]的关系:0.5*age[A]+7 < age[A]

可得:14 < age[A]
因此age[A]的范围为: [ 15 ~ 120 ]

age[B]的范围为:[ 0.5*age[A]+8 ~ age[A] ]

当A遇到,满足以上条件的B,则会发送好友请求。数量为:age[A]的人数*age[B]的人数。(其中,当两个岁数相同,自己不会给自己发送请求,age[A]的人数*(age[B]的人数-1))

代码参考:

 1 class Solution {
 2 public:
 3     int numFriendRequests(vector<int>& ages) {
 4         int res=0;
 5         map<int, int>agescout;
 6         for(int age:ages){
 7             agescout[age]++;
 8         }
 9         for(int i=15; i<=120; i++){//A
10             for(int j=0.5*i+8; j<=i; j++){//B
11                 res+=(agescout[i]*(agescout[j]-(i==j?1:0)));
12             }
13         }
14         return res;
15     }
16 };
原文地址:https://www.cnblogs.com/habibah-chang/p/12877401.html