假设有人会提出朋友请求。我们知道他们的年龄,这些年龄存储在年龄[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