大家好,这里是Xueliang。
今天带来Leetcode的第1583题:统计不开心的朋友。这是一道中等难度的题目。
题目描述
解题思路
这道题最核心的地方在于:
创建一个 的数组
index_matric
,index_matric[i][j]
保存的是j
在i
的朋友中亲近度排第几;这个数组可以通过preferences
得到创建一个长度为
n
的数组match
,match[x]=y
代表x
和y
是配对的;这个数组可以通过pairs
得到
在创建好这两个数组后,算法的伪代码如下:
遍历
n
个人对于第
x
人,在match
数组中找到其对应的配对y=match[x]
通过
index_matric[x][y]
找到y
在x
的朋友中亲近度排第几,令这个值为index
遍历
x
的朋友中所有排名比index
高的的人u
通过
match[u]
找到u
的配对v
;如果index_matric[u][x]<index_matric[u][v]
,我们就认为x
是不开心的
代码实现
//C++
class Solution {
public:
int unhappyFriends(int n, vector<vector<int>>& preferences, vector<vector<int>>& pairs) {
vector<vector<int>> index_matric(n, vector<int>(n));
for(int i=0; i<n;i++){
for(int j=0; j<n-1;j++){
index_matric[i][preferences[i][j]]=j;
}
}
vector<int> match(n);
for(auto pair: pairs){
int person0 = pair[0];
int person1 = pair[1];
match[person0] = person1;
match[person1] = person0;
}
int rst = 0;
for(int x = 0; x<n; x++){
int y = match[x];
int index = index_matric[x][y];
for(int i=0; i<index;i++){
int u = preferences[x][i];
int v = match[u];
if(index_matric[u][x]<index_matric[u][v]){
rst+=1;
break;
}
}
}
return rst;
}
};
##Python
class Solution:
def unhappyFriends(self, n: int, preferences: List[List[int]], pairs: List[List[int]]) -> int:
index_matrix = []
for i in range(n):
tmp = [0 for ii in range(n)]
for j in range(n-1):
tmp[preferences[i][j]]=j
index_matrix.append(tmp)
match = [0 for i in range(n)]
for i in range(len(pairs)):
person0 = pairs[i][0]
person1 = pairs[i][1]
match[person0] = person1
match[person1] = person0
rst = 0
for x in range(n):
y = match[x]
index = index_matrix[x][y]
for i in range(index):
u = preferences[x][i]
v = match[u]
if(index_matrix[u][x]<index_matrix[u][v]):
rst+=1
break
return rst