Description
You are given a list of preferences for n friends, where n is always even.
For each person i, preferences[i] contains a list of friends sorted in the order of preference. In other words, a friend earlier in the list is more preferred than a friend later in the list. Friends in each list are denoted by integers from 0 to n-1.
All the friends are divided into pairs. The pairings are given in a list pairs, where pairs[i] = [xi, yi] denotes xi is paired with yi and yi is paired with xi.
However, this pairing may cause some of the friends to be unhappy. A friend x is unhappy if x is paired with y and there exists a friend u who is paired with v but:
xprefersuovery, anduprefersxoverv.
Return the number of unhappy friends.
Example 1:
Input: n = 4, preferences = [[1, 2, 3], [3, 2, 0], [3, 1, 0], [1, 2, 0]], pairs = [[0, 1], [2, 3]] Output: 2 Explanation: Friend 1 is unhappy because: - 1 is paired with 0 but prefers 3 over 0, and - 3 prefers 1 over 2. Friend 3 is unhappy because: - 3 is paired with 2 but prefers 1 over 2, and - 1 prefers 3 over 0. Friends 0 and 2 are happy.
Example 2:
Input: n = 2, preferences = [[1], [0]], pairs = [[1, 0]] Output: 0 Explanation: Both friends 0 and 1 are happy.
Example 3:
Input: n = 4, preferences = [[1, 3, 2], [2, 3, 0], [1, 3, 0], [0, 2, 1]], pairs = [[1, 3], [0, 2]] Output: 4
Constraints:
2 <= n <= 500nis even.preferences.length == npreferences[i].length == n - 10 <= preferences[i][j] <= n - 1preferences[i]does not containi.- All values in
preferences[i]are unique. pairs.length == n/2pairs[i].length == 2xi != yi0 <= xi, yi <= n - 1- Each person is contained in exactly one pair.
Solutions
Solution 1: Enumeration
We use an array d to record the closeness between each pair of friends, where d[i][j] represents the closeness of friend i to friend j (the smaller the value, the closer they are). Additionally, we use an array p to record the paired friend for each friend.
We enumerate each friend x. For x's paired friend y, we find the closeness d[x][y] of x to y. Then, we enumerate other friends u who are closer than d[x][y]. If there exists a friend u such that the closeness d[u][x] of u to x is higher than d[u][y], then x is an unhappy friend, and we increment the result by one.
After the enumeration, we obtain the number of unhappy friends.
The time complexity is O(n2), and the space complexity is O(n2). Here, n is the number of friends.
class Solution: def unhappyFriends( self, n: int, preferences: List[List[int]], pairs: List[List[int]] ) -> int: d = [{x: j for j, x in enumerate(p)} for p in preferences] p = {} for x, y in pairs: p[x] = y p[y] = x ans = 0 for x in range(n): y = p[x] for i in range(d[x][y]): u = preferences[x][i] v = p[u] if d[u][x] < d[u][v]: ans += 1 break return ans(code-box)
