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 };