1583. 统计不开心的朋友
方法一:模拟 从 pairs 入手
class Solution:
def unhappyFriends(self, n: int, preferences: List[List[int]], pairs: List[List[int]]) -> int:
d, res = {}, 0
w = {(i,preferences[i][j]):j for i in range(n) for j in range(n-1)}
for x, y in pairs: d[x], d[y] = y, x
for x in range(n):
y = d[x]
for u, v in pairs:
if (x,y) == (u,v) or (x,y) == (v,u): continue
if (w[(x,y)] > w[(x,u)] and w[(u,v)] > w[(u,x)]) \
or (w[(x,y)] > w[(x,v)] and w[(v,u)] > w[(v,x)]):
res += 1
break
return res
方法二:模拟 从小于 y 的索引开始
class Solution:
def unhappyFriends(self, n: int, preferences: List[List[int]], pairs: List[List[int]]) -> int:
d, res = [0]*n, 0
w = [[0] * n for _ in range(n)]
for i in range(n):
for j in range(n - 1):
w[i][preferences[i][j]] = j # i 行,j 列中值的索引 j
for x, y in pairs: d[x], d[y] = y, x
for x in range(n):
# x -> y -> y 在 x 行中的索引 w[x][y] -> 遍历小于索引的 u -> v 如果 v 在 u 行的索引 < x 在 u 行的索引 => x 不高兴了
y = d[x]
for i in range(w[x][y]):
u = preferences[x][i] # 从 y 的索引前面开始 在 x 中 u 比 x 亲近。
v = d[u]
if w[u][v] > w[u][x]: # 第一个条件上面已经满足了,只需要第二个条件成立即可。
res += 1
break
return res
方法三:模拟 改用 index()
class Solution:
def unhappyFriends(self, n: int, preferences: List[List[int]], pairs: List[List[int]]) -> int:
d, res = [0]*n, 0
for x, y in pairs: d[x], d[y] = y, x
for x in range(n):
y = d[x]
for u in preferences[x][:preferences[x].index(y)]:
# for i in range(preferences[x].index(y)):
# u = preferences[x][i] # 从 y 的索引前面开始 在 x 中 u 比 x 亲近。
v = d[u]
# 第一个条件上面已经满足了,只需要第二个条件成立即可。
if preferences[u].index(v) > preferences[u].index(x) :
res += 1
break
return res
最终代码
class Solution:
def unhappyFriends(self, n: int, p: List[List[int]], pairs: List[List[int]]) -> int:
d, res = [0]*n, 0
for x, y in pairs: d[x], d[y] = y, x
for x, y in enumerate(d):
for u in p[x][:p[x].index(y)]:
v = d[u]
if p[u].index(v) > p[u].index(x) :
res += 1
break
return res