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