Some people will make friend requests. The list of their ages is given and ages[i]
is the age of the ith person.
Person A will NOT friend request person B (B != A) if any of the following conditions are true:
age[B] <= 0.5 * age[A] + 7
age[B] > age[A]
age[B] > 100 && age[A] < 100
Otherwise, A will friend request B.
Note that if A requests B, B does not necessarily request A. Also, people will not friend request themselves.
How many total friend requests are made?
Example 1:
Input: [16,16] Output: 2 Explanation: 2 people friend request each other.
Example 2:
Input: [16,17,18] Output: 2 Explanation: Friend requests are made 17 -> 16, 18 -> 17.
Example 3:
Input: [20,30,100,110,120] Output: Explanation: Friend requests are made 110 -> 100, 120 -> 110, 120 -> 100.
Notes:
1 <= ages.length <= 20000
.1 <= ages[i] <= 120
.
思路:因为ages[i] [1,120],所以先用桶排序,count有多少个频率,因为合理的范围为(0.5 * A + 7 , A] ,A > 0.5 * A + 7,那么A必须从15岁开始;然后用prefixsum计算prefixsum[i] - prefixsum[i / 2 + 7] 的有多少,然后减去1,因为自己不能给自己发,乘以现在bucket的数目;累积起来就是答案。这里bucket sort,比较牛逼,然后prefixsum也是求范围数量的利器;
class Solution {
public int numFriendRequests(int[] ages) {
if(ages == null || ages.length == 0) {
return 0;
}
int[] countAges = new int[121];
int[] prefixsum = new int[121];
// 桶排序,count一下;
for(int i : ages) {
countAges[i]++;
}
// 算prefixsum;
for(int i = 1; i < 121; i++) {
prefixsum[i] = prefixsum[i - 1] + countAges[i];
}
int res = 0;
// 合格范围为: (0.5 * A + 7, A]
// 计算合理区间有多少个,然后减去自己,然后乘以现在有多少个在agecount[i]里面;
for(int i = 15; i < 121; i++) {
int count = prefixsum[i] - prefixsum[i / 2 + 7];
res += (count - 1) * countAges[i]; // 减一是因为不能给自己发邀请;
}
return res;
}
}