Formatted question description: https://leetcode.ca/all/825.html
825. Friends Of Appropriate Ages (Medium)
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
.
Companies:
Facebook
Related Topics:
Array
Solution 1.
// OJ: https://leetcode.com/problems/friends-of-appropriate-ages/
// Time: O(N)
// Space: O(1)
class Solution {
private:
bool request(int A, int B) {
return !(B <= .5 * A + 7 || B > A);
}
public:
int numFriendRequests(vector<int>& ages) {
int ans = 0;
vector<int> cnts(120, 0);
for (int age : ages) cnts[age - 1]++;
for (int i = 0; i < 120; ++i) {
if (!cnts[i]) continue;
for (int j = 0; j < 120; ++j) {
if (!cnts[j] || !request(i + 1, j + 1)) continue;
ans += cnts[i] * cnts[j];
if (i == j) ans -= cnts[i];
}
}
return ans;
}
};
Java
-
class Solution { public int numFriendRequests(int[] ages) { Arrays.sort(ages); Map<Integer, Integer> ageCountMap = new HashMap<Integer, Integer>(); for (int age : ages) { int count = ageCountMap.getOrDefault(age, 0) + 1; ageCountMap.put(age, count); } int friendRequests = 0; int length = ages.length; for (int i = 0; i < length; i++) { if (i > 0 && ages[i] == ages[i - 1]) continue; int age = ages[i]; int minAge = age / 2 + 8; if (minAge > age) continue; int minIndex = binarySearch(ages, minAge); int count = ageCountMap.get(age); friendRequests += count * (i - minIndex); friendRequests += count * (count - 1); } return friendRequests; } public int binarySearch(int[] ages, int minAge) { int low = 0, high = ages.length - 1; while (low < high) { int mid = (high - low) / 2 + low; int age = ages[mid]; if (age < minAge) low = mid + 1; else high = mid; } return low; } }
-
// OJ: https://leetcode.com/problems/friends-of-appropriate-ages/ // Time: O(N) // Space: O(1) class Solution { private: bool request(int A, int B) { return !(B <= .5 * A + 7 || B > A); } public: int numFriendRequests(vector<int>& ages) { int ans = 0; vector<int> cnts(120, 0); for (int age : ages) cnts[age - 1]++; for (int i = 0; i < 120; ++i) { if (!cnts[i]) continue; for (int j = 0; j < 120; ++j) { if (!cnts[j] || !request(i + 1, j + 1)) continue; ans += cnts[i] * cnts[j]; if (i == j) ans -= cnts[i]; } } return ans; } };
-
class Solution(object): def numFriendRequests(self, ages): """ :type ages: List[int] :rtype: int """ count = collections.Counter(ages) ages = sorted(count.keys()) N = len(ages) res = 0 for A in ages: for B in range(int(0.5 * A) + 7 + 1, A + 1): res += count[A] * (count[B] - int(A == B)) return res