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:
- x prefers u over y, and
- u prefers x over v.
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 <= 500
- n is even.
- preferences.length == n
- preferences[i].length == n - 1
- 0 <= preferences[i][j] <= n - 1
- preferences[i] does not contain i.
- All values in preferences[i] are unique.
- pairs.length == n/2
- pairs[i].length == 2
- xi != yi
- 0 <= xi, yi <= n - 1
- Each person is contained in exactly one pair.
分析
题目的意思是:这道题半天没读懂题目的意思,preference表示的是每个朋友喜欢的朋友顺序,pairs表示的朋友之间的配对。然后定义了一下不开心朋友,比如x和y进行配对了,但是存在u和v的配对,x更喜欢u而不是y,u则更喜欢x而不是v,大家相互交叉喜欢。
rank[x][u]<rank[x][y] and rank[u][x]<rank[u][partner[u]]
要求全部找出来。首先用ranks字典简历每个人的喜欢的朋友的偏好;然后partner简历pairs的双向连接。遍历partner中的每一对(p1,p2),遍历其是否满足条件就行了。
代码
class Solution:
def unhappyFriends(self, n: int, preferences: List[List[int]], pairs: List[List[int]]) -> int:
ranks={}
for person,pref in enumerate(preferences):
ranks[person]=defaultdict(lambda:n)
for rank,peer in enumerate(pref):
ranks[person][peer]=rank
partner={}
for p1,p2 in pairs:
partner[p1]=p2
partner[p2]=p1
res=0
for p1,p2 in pairs:
for peer in preferences[p1]:
if(ranks[p1][peer]<ranks[p1][p2] and ranks[peer][p1]<ranks[peer][partner[peer]]):
res+=1
break
for peer in preferences[p2]:
if(ranks[p2][peer]<ranks[p2][p1] and ranks[peer][p2]<ranks[peer][partner[peer]]):
res+=1
break
return res
参考文献
[LeetCode] Python3 straightforward solution - Count Unhappy Friends