题目链接
思路
前缀和,注意到年龄的范围是1-120,于是我们可以把各个年龄的人数统计起来,然后用前缀和快速找出范围在[down-up]之间的人数,加到ans上。
代码
class Solution {
public:
int numFriendRequests(vector<int>& ages) {
int n=ages.size();
int ans=0;
vector<int>cnt(121,0);
for(int i=0;i<n;i++){
cnt[ages[i]]++;
}
vector<int>sum(122,0);
for(int i=1;i<=120;i++){
sum[i]=sum[i-1]+cnt[i];
}
for(int i=0;i<n;i++){
int up=ages[i];
int down=0.5*ages[i]+7;
//不符合要求直接跳过
if(down>up)continue;
if(sum[up]-sum[down]<=0)continue;
//注意要减去自己
ans+=sum[up]-sum[down]-1;
cout<<ans<<endl;
}
return ans;
}
};