If we sort the ages, we can efficiently count valid friend requests for each person by using two pointers to find the valid age range for each person. This avoids checking every possible pair.
classSolution {
public:int numFriendRequests(vector<int>& ages) {
sort(ages.begin(), ages.end());
int ans =0, n = ages.size();
for (int i =0; i < n; ++i) {
int a = ages[i];
int l = upper_bound(ages.begin(), ages.end(), 0.5* a +7) - ages.begin();
int r = upper_bound(ages.begin(), ages.end(), a) - ages.begin();
if (r > l +1) ans += r - l -1;
}
return ans;
}
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
typeSolutionstruct{}
func (Solution) numFriendRequests(ages []int) int {
sort.Ints(ages)
ans, n:=0, len(ages)
fori:=0; i < n; i++ {
a:=ages[i]
l:=sort.SearchInts(ages, int(0.5*float64(a)+7.1)+1)
r:=sort.SearchInts(ages, a+1)
ifr > l+1 {
ans+=r-l-1 }
}
returnans}
classSolution {
publicintnumFriendRequests(int[] ages) {
Arrays.sort(ages);
int ans = 0, n = ages.length;
for (int i = 0; i < n; i++) {
int a = ages[i];
int l = upperBound(ages, (int)(0.5* a + 7));
int r = upperBound(ages, a);
if (r > l + 1) ans += r - l - 1;
}
return ans;
}
privateintupperBound(int[] arr, int val) {
int l = 0, r = arr.length;
while (l < r) {
int m = (l + r) / 2;
if (arr[m]<= val) l = m + 1;
else r = m;
}
return l;
}
}
classSolution {
funnumFriendRequests(ages: IntArray): Int {
ages.sort()
var ans = 0for (i in ages.indices) {
val a = ages[i]
val l = ages.upperBound((0.5 * a + 7).toInt())
val r = ages.upperBound(a)
if (r > l + 1) ans += r - l - 1 }
return ans
}
privatefunIntArray.upperBound(x: Int): Int {
var l = 0; var r = size
while (l < r) {
val m = (l + r) / 2if (this[m] <= x) l = m + 1else r = m
}
return l
}
}
classSolution:
defnumFriendRequests(self, ages: list[int]) -> int:
ages.sort()
ans =0 n = len(ages)
for i, a in enumerate(ages):
l = self.upper_bound(ages, 0.5* a +7)
r = self.upper_bound(ages, a)
if r > l +1:
ans += r - l -1return ans
defupper_bound(self, arr: list[int], val: float) -> int:
l, r =0, len(arr)
while l < r:
m = (l + r) //2if arr[m] <= val:
l = m +1else:
r = m
return l
impl Solution {
pubfnnum_friend_requests(mut ages: Vec<i32>) -> i32 {
ages.sort();
let n = ages.len();
letmut ans =0;
for i in0..n {
let a = ages[i];
let l = upper_bound(&ages, (0.5* a asf64+7.0) asi32);
let r = upper_bound(&ages, a);
if r > l +1 {
ans += (r - l -1) asi32;
}
}
ans
}
}
fnupper_bound(arr: &Vec<i32>, val: i32) -> usize {
let (mut l, mut r) = (0, arr.len());
while l < r {
let m = (l + r) /2;
if arr[m] <= val {
l = m +1;
} else {
r = m;
}
}
l
}