题目来源:https://leetcode-cn.com/problems/count-unhappy-friends/
大致题意:
给出人数(偶数),和每个人对于其他人的好感度排名(从高到低),还有总人数除2个匹配(将两个人匹配到一起)。
对于一个人x来说,有:
- 其和 y 匹配,即(x, y)
- y 在其好感度排名中低于 u
- 若 u 与 v 匹配,即(u, v)
- 而且 x 在 u 的好感度排名中高于 v
如果同时满足以上条件,则x不开心
思路
直接模拟
- 使用一个二维数组index[i][j]存下 i 的好感度排名中,j 所处的索引位置(即排名)
- 使用一维数组match[i]表示 i 匹配的人
- 从0至n-1遍历所有的match数组,若其满足刚刚提到的条件,则不开心人数++
代码:
public int unhappyFriends(int n, int[][] preferences, int[][] pairs) {
int ans = 0;
int[][] index = new int[n][n];
// 初始化索引数组
for (int i = 0; i < n; i++) {
for (int j = 0; j < n-1; j++) {
index[i][preferences[i][j]] = j;
}
}
int[] match = new int[n];
// 初始化匹配数组
for (int[] pair : pairs) {
int x = pair[0];
int y = pair[1];
match[x] = y;
match[y] = x;
}
// x 与 y 匹配,找到y在x对应的preference下标idx
// 在[0, idx)区间内所有的朋友都可能为 u
// 找到 u 匹配的 v
// 若index[u][x] < index[u][v],则 x 不开心
for (int x = 0; x < n; x++) {
// 获取匹配对象y
int y = match[x];
// 获取y在x的好感度排名
int idx = index[x][y];
// 寻找是否满足不开心条件
for (int i = 0; i < idx; i++) {
// 找到u
int u = preferences[x][i];
// 找到u匹配的v
int v = match[u];
// 是否满足不开心条件
if (index[u][x] < index[u][v])
ans++;
// 本轮x已经定为不开心,不用遍历剩余对象
break;
}
}
return ans;
}