Friends Of Appropriate Ages
Some people will make friend requests. The list of their ages is given and ages[i] is the age of the ith person.
Person A will NOT friend request person B (B != A) if any of the following conditions are true:
- age[B] <= 0.5 * age[A] + 7
- age[B] > age[A]
- age[B] > 100 && age[A] < 100
Otherwise, A will friend request B.
Note that if A requests B, B does not necessarily request A. Also, people will not friend request themselves.
How many total friend requests are made?
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.
Solution 1
统计每个年龄出现的次数,并排好序。依照规则,肯定不能和年龄更大的交朋友。所以我们从年龄大的开始遍历,他们可能的交朋友的情况只有同龄人或者年龄更小的,而且必须满足第一个条件。
1. 同龄人,则可交朋友数量为 N * (N - 1)
2. 低龄人,则可交朋友数量为 M * N
其中M,N分别为此年龄出现的次数。
// by subenle
class Solution {
private:
bool isFriend(int lhs, int rhs){ // 调用此函数要确保 lhs > rhs
if(rhs <= (0.5 * lhs + 7)) return false;
return true;
}
public:
int numFriendRequests(vector<int>& ages) {
int rst = 0;
map<int, int> agecnt;
for(int i = 0; i < ages.size(); i++){
if(agecnt.find(ages[i]) == agecnt.end()){
agecnt[ages[i]] = 1;
}
else{
agecnt[ages[i]]++;
}
}
for(auto it = agecnt.rbegin(); it != agecnt.rend(); it++){
int lsecond = (*it).second;
if( lsecond > 1 && isFriend((*it).first, (*it).first))
rst += lsecond * (lsecond -1);
for(auto iit = next(it); iit != agecnt.rend(); iit++){
if(isFriend((*it).first, (*iit).first)){
rst += (*iit).second * lsecond;
}
else
break; // 一旦出现不满足条件的,说明低龄的年龄已经太小,没必要再比下去了
}
}
return rst;
}
};
Solution 2
// by JOHNKRAM
class Solution {
public:
int numFriendRequests(vector<int>& ages) {
int s[200],ans=0,n=ages.size(),i,j;
memset(s,0,sizeof(s));
for(i=0;i<n;i++) s[ages[i]]++; // 每个年龄出现的次数
for(i=1;i<121;i++) // 遍历年龄,i 指向年龄较大的
for(j=(i>>1)+8;j<=i;j++) // j 从 i/2 + 8 开始,递增到i
if(j<=100||i>=100)
if(i!=j)
ans+=s[i]*s[j];
else
ans+=s[i]*(s[i]-1);
return ans;
}
};