题目:
在社交媒体网站上有 n 个用户。给你一个整数数组 ages ,其中 ages[i] 是第 i 个用户的年龄。
如果下述任意一个条件为真,那么用户 x 将不会向用户 y(x != y)发送好友请求:
ages[y] <= 0.5 * ages[x] + 7
ages[y] > ages[x]
ages[y] > 100 && ages[x] < 100
否则,x 将会向 y 发送一条好友请求。
注意,如果 x 向 y 发送一条好友请求,y 不必也向 x 发送一条好友请求。另外,用户不会向自己发送好友请求。
返回在该社交媒体网站上产生的好友请求总数。
示例 1:
输入:ages = [16,16]
输出:2
解释:2 人互发好友请求。
示例 2:
输入:ages = [16,17,18]
输出:2
解释:产生的好友请求为 17 -> 16 ,18 -> 17 。
示例 3:
输入:ages = [20,30,100,110,120]
输出:3
解释:产生的好友请求为 110 -> 100 ,120 -> 110 ,120 -> 100 。
提示:
n == ages.length
1 <= n <= 2 * 104
1 <= ages[i] <= 120
思路:
先对数组排序然后保证了我们要找的区间只会递增为双指针创造了条件,然后循环一遍由于我们要找的朋友区间左端和右端都只会向后延申,我们首先用x来对应要满足的x的条件所以里面用while找的左区间需要的分界的第一个不满足我们条件ages[y] <= 0.5 * ages[x] + 7的位置,然后再找ages[y] > ages[x]的第一个不满足我们条件由于ages[x]小于等于14我们判断的两区间就相交无答案所以跳过,第三个条件和第二个条件为包含关系也不用管,ages[x]只会变大导致区间也不断变大不会变小所以只需o(n)的时间皆可用左右区间相减再减去他自己就是每个ages的朋友加起来就剩总共的好友数
代码如下:
class Solution {
public:
int numFriendRequests(vector<int>& ages) {
sort(ages.begin(),ages.end());
int sum = 0;
int left = 0, right = 0;
for(int x = 0;x < ages.size();++x) {
if(ages[x] <= 14) {
continue;
}
while(left < ages.size() && 0.5*ages[x]+7 >= ages[left]) {
left++;
}
while(right < ages.size() && ages[right] <= ages[x]) {
right++;
}
sum += max(0, right-left-1);
}
return sum;
}
};