题目:
给你一份 n 位朋友的亲近程度列表,其中 n 总是 偶数 。
对每位朋友 i,preferences[i] 包含一份 按亲近程度从高到低排列 的朋友列表。换句话说,排在列表前面的朋友与 i 的亲近程度比排在列表后面的朋友更高。每个列表中的朋友均以 0 到 n-1 之间的整数表示。
所有的朋友被分成几对,配对情况以列表 pairs 给出,其中 pairs[i] = [xi, yi] 表示 xi 与 yi 配对,且 yi 与 xi 配对。
但是,这样的配对情况可能会是其中部分朋友感到不开心。在 x 与 y 配对且 u 与 v 配对的情况下,如果同时满足下述两个条件,x 就会不开心:
x 与 u 的亲近程度胜过 x 与 y,且
u 与 x 的亲近程度胜过 u 与 v
返回 不开心的朋友的数目 。
解答:
class Solution:
def unhappyFriends(self, n: int, preferences: List[List[int]], pairs: List[List[int]]) -> int:
t=n//2
res=0
for i in range(t):
for m in range(2):
if m==0:
y,x=pairs[i]
else:
x,y=pairs[i]
if preferences[y][0]!=x:
#则y可能会不开心
for prefer in preferences[y]:
prefer_list=preferences[prefer]
#若prefer为x,则无需继续判断
if prefer==x:
break
#(y,当前朋友)比(y,x)更亲近
else:
flag=False
for j in range(t):
#寻找当前朋友prefer的配对好友cur
if prefer in pairs[j]:
if prefer==pairs[j][0]:
cur=pairs[j][1]
else:
cur=pairs[j][0]
#看(当前朋友,y)是否比(当前朋友,配对好友)更亲近,若是则y不开心
if prefer_list.index(y)<prefer_list.index(cur):
res+=1
flag=True
break
#若已判断出y不开心,则无需继续
if flag:
break
return res