#哈希表 #贪心算法
题目:在一个由 m
个用户组成的社交网络里,我们获取到一些用户之间的好友关系。两个用户之间可以相互沟通的条件是他们都掌握同一门语言。
给你一个整数 n
,数组 languages
和数组 friendships
,它们的含义如下:
- 总共有
n
种语言,编号从1
到n
。 languages[i]
是第i
位用户掌握的语言集合。friendships[i] = [ui, vi]
表示ui
和vi
为好友关系。
你可以选择 一门 语言并教会一些用户,使得所有好友之间都可以相互沟通。请返回你 最少 需要教会多少名用户。
请注意,好友关系没有传递性,也就是说如果 x
和 y
是好友,且 y
和 z
是好友, x
和 z
不一定是好友。
可以注意到,对于已经可以沟通的好友,我们不需要考虑,故而首先应当确定无法进行沟通的用户对。
unordered_set<int>cncon;
for(auto friendship:friendships){
unordered_set<int>st;
bool conm=false;
for(auto lan:languages[friendship[0]-1]){
st.insert(lan);
}
for(auto lan:languages[friendship[1]-1]){
if(st.find(lan)!=st.end()){
conm=true;
break;
}
}
if(conm=false){
cncon.insert([friendship[0]-1]);
cncon.insert([friendship[1]-1]);
}
}
找到所有无法沟通的用户之后,只需要再确定出掌握人数最多的语言即可。无法沟通的用户总人数减去掌握人数最多的语言人数,即为所求答案。
全部代码:
class Solution {
public:
int minimumTeachings(int n, vector<vector<int>>& languages, vector<vector<int>>& friendships) {
//存储不能相互沟通的好友
unordered_set<int>cncon;
for(auto friendship:friendships){
unordered_map<int,int>mp;
bool conm=false;
for(int lan:languages[friendship[0]-1]){
mp[lan]=1;
}
for(int lan:languages[friendship[1]-1]){
if(mp[lan]==1){
conm=true;
break;
}
}
if(!conm){
cncon.insert(friendship[0]-1);
cncon.insert(friendship[1]-1);
}
}
int max_cnt=0;
//统计无法沟通的人中,每一种语言掌握的人数
vector<int>cnt(n+1,0);
for(auto friendship:cncon){
for(int lan:languages[friendship]){
cnt[lan]++;
max_cnt=max(max_cnt,cnt[lan]);
}
}
return cncon.size()-max_cnt;
}
};