1583. 统计不开心的朋友
大约 4 分钟
---
1583. 统计不开心的朋友
- 标签:数组、模拟
- 难度:中等
题目链接
题目大意
描述:给定 位朋友( 为偶数),编号 。以及一个 的二维数组 ,其中 是一个长度为 的排列,按亲近程度从高到低排列了 的所有其他朋友。
另外给定一个 的二维数组 ,表示已经配对的 对朋友。
如果一对朋友 配对,但存在另一对朋友 配对,使得:
- 与 的亲近程度高于 与 (即 在 的 preferences 中排在 前面)。
- 与 的亲近程度高于 与 (即 在 的 preferences 中排在 前面)。
则称 是不开心的。
要求:返回不开心的朋友数量。
说明:
- 。
- 为偶数。
- 长度为 ,是 除 外所有数的排列。
- 长度为 ,且每个朋友恰好出现一次。
示例:
- 示例 1:
输入:n = 4, preferences = [[1, 2, 3], [3, 2, 0], [3, 1, 0], [1, 2, 0]], pairs = [[0, 1], [2, 3]]
输出:2
解释:
朋友 1 不开心,因为:
- 1 与 0 配对,但 1 与 3 的亲近程度比 1 与 0 高,且
- 3 与 1 的亲近程度比 3 与 2 高。
朋友 3 不开心,因为:
- 3 与 2 配对,但 3 与 1 的亲近程度比 3 与 2 高,且
- 1 与 3 的亲近程度比 1 与 0 高。
朋友 0 和 2 都是开心的。- 示例 2:
输入:n = 2, preferences = [[1], [0]], pairs = [[1, 0]]
输出:0
解释:朋友 0 和 1 都开心。解题思路
思路 1:模拟 + 哈希表
1. 核心思想
不开心的定义:对于配对 ,如果存在另一配对 ,使得 更亲近 (胜过 )且 更亲近 (胜过 ),则 不开心。
简单模拟:建立一个亲近程度排名矩阵 ,表示 在 的 preferences 中的位置(越小越亲近)。
对于每个配对 ,检查所有其他配对 是否满足条件。
2. 具体步骤
第 1 步:建立 矩阵。 表示 是 的第 亲近的朋友( 越小越亲近)。
第 2 步:建立配对映射 , 表示 的配对对象。
第 3 步:对每个配对 :
- 遍历 的 preferences 中排在 之前的所有人 (即比 更亲近的人)。
- 找到 的配对对象 。
- 检查 ($u$ 更亲近 胜过其配对对象)。
- 如果成立, 不开心,计数加一并跳出。
第 4 步:返回不开心总数。
3. 正确性证明
- 条件中 和 相互更亲近( 更亲近 胜过 ,且 更亲近 胜过 ),这种"单向更喜欢"的关系会使 不开心。
- 注意条件是不对称的: 不开心只需要存在一个满足条件的 ,而不是 也必须不开心。
- 遍历所有配对,检查每个人的所有可能 ,时间复杂度 。
4. 举例说明
以 为例:
配对:
检查 (配 ):
- 的 preferences: ,排在 前面的人:无( 排第一)。
- 没有更亲近的 ,不满足条件。
检查 (配 ):
- 的 ,排在 前面的人:。
- ,。(因为 的 preference 是 , 排第 0),。,满足条件! 不开心。
- ,。( 的 preference ),。 不满足。
所以 不开心,总数为 。
思路 1:代码
class Solution:
def unhappyFriends(self, n: int, preferences: List[List[int]], pairs: List[List[int]]) -> int:
# rank[i][j] = k 表示 j 在 i 的 preferences 中的位置(0-based)
rank = [[0] * n for _ in range(n)]
for i in range(n):
for k, j in enumerate(preferences[i]):
rank[i][j] = k
# 配对映射
pair_map = {}
for x, y in pairs:
pair_map[x] = y
pair_map[y] = x
unhappy = set()
for x, y in pairs:
# 检查 x
for u in preferences[x]:
if u == y:
break
v = pair_map[u]
if rank[u][x] < rank[u][v]:
unhappy.add(x)
break
# 检查 y
for u in preferences[y]:
if u == x:
break
v = pair_map[u]
if rank[u][y] < rank[u][v]:
unhappy.add(y)
break
return len(unhappy)思路 1:复杂度分析
- 时间复杂度:,对每个人最多遍历其 preferences(长度 )。
- 空间复杂度:,rank 矩阵。