人们会互相发送好友请求,现在给定一个包含有他们年龄的数组,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 发出请求。而且,人们不会给自己发送好友请求。
求总共会发出多少份好友请求?
说明:
1 <= ages.length <= 20000.
1 <= ages[i] <= 120.
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/friends-of-appropriate-ages
解法
最直接的方法是两重for循环遍历ages数组,对每个ages[i]判断适龄好友数。
由于ages.length最高为20000,所以这个方法耗时太长。
注意到1 <= ages[i] <= 120,而age是整数,所以取值只有120种,可以统计ages[i]出现的次数cnt[i],将遍历ages改为遍历cnt,从而将数据规模由20000降为120。
代码:
class Solution {
public:
int numFriendRequests(vector<int>& ages)
{
int cnt[121] = {0};
for (auto i : ages)
{
++cnt[i];
}
int ans = 0;
for (int i = 1; i < 121; ++i)
{
for (int j = 1; j < 121; ++j)
{
if (cnt[i] > 0 && cnt[j] > 0 && canBeFriend(i, j))
{
if (i == j)
ans += ((cnt[i] - 1) * cnt[i]);
else
ans += (cnt[i] * cnt[j]);
}
}
}
return ans;
}
private:
bool canBeFriend(int a, int b) const
{
return !(b <= 0.5 * a + 7 ||
b > a ||
(b > 100 && a < 100));
}
};
欢迎关注【CPP笔记】