假设有人会提出朋友请求。我们知道他们的年龄,这些年龄存储在年龄[i]中。因此,这表明第i个人的年龄。现在,如果满足以下任一条件,则A不会成为好友请求人B(B!= A)-
年龄[B] <= 0.5 *年龄[A] + 7
年龄[B]>年龄[A]
年龄[B]> 100 &&年龄[A] <100
否则,A将朋友请求B。您可以认为,如果A请求B,则B不一定请求A。而且,人们也不会朋友请求自己。因此,我们必须查找总共发出了多少个好友请求?
假设age数组类似于[16,17,18],则结果将为2,因为请求将为17-> 16,18-> 17。
为了解决这个问题,我们将遵循以下步骤-
定义大小为1000的数组存储桶,然后将年龄数组元素的频率存储在存储桶中。
然后找到并存储存储桶元素的累计和
ret:= 0
对于0到年龄数组大小的范围中的i – 1
ret:= bucket [x] – bucket [y]
如果bucket [x] – bucket [y]不为零,则将ret减小1
x:= ages [i],y:=(ages [i] / 2)+ 7
如果x> = y,则
返回ret。
让我们看下面的实现以更好地理解-
#include <bits/stdc++.h> using namespace std; class Solution { public: int numFriendRequests(vector<int>& ages) { vector <int> bucket(1000); for(int i = 0; i < ages.size(); i++){ bucket[ages[i]]++; } for(int i = 1; i < 1000; i++)bucket[i] += bucket[i - 1]; int ret = 0; for(int i = 0; i < ages.size(); i++){ int x = ages[i]; int y = ((ages[i]) / 2) + 7; if(x >= y){ ret += (bucket[x] - bucket[y]); if((bucket[x] - bucket[y])) ret--; } } return ret; } }; main(){ vector<int> v1 = {16, 17, 18}; Solution ob; cout << (ob.numFriendRequests(v1)); }
[16,17,18]
输出结果
2