基本思想:
并查集,恶心的一笔,纯纯的基本功,恶心在map映射上;
具体代码:
class Solution {
public:
int findfather(int x){
int temp=x;
while(x!=fa[x])
x=fa[x];
return x;
}
void union_(int x,int y){
int nx=findfather(x);
int ny=findfather(y);
fa[nx]=ny;
}
void preset(){
for(int i=0;i<fa.size();i++){
fa[i]=i;
}
}
vector<vector<string>> accountsMerge(vector<vector<string>>& accounts) {
int index=0;
for(int i=0;i<accounts.size();i++){
for(int j=1;j<accounts[i].size();j++){
if(id_mp.find(accounts[i][j])==id_mp.end()){
id_mp[accounts[i][j]]=index;//对邮箱进行编号;
id_map_r[index++]=accounts[i][0];
}
}
}
fa.resize(index);//总共有index个id;
preset();
for(int i=0;i<accounts.size();i++){
int id_=id_mp[accounts[i][1]];
for(int j=2;j<accounts[i].size();j++){
int id=id_mp[accounts[i][j]];
union_(id,id_);
}
}
for(auto it=id_mp.begin();it!=id_mp.end();it++){
int root=findfather(it->second);
root_childen[root].push_back(it->first);
}
//开始构造最终结果;
vector<vector<string>>ret;
for(auto it=root_childen.begin();it!=root_childen.end();it++){
vector<string> member=it->second;
sort(member.begin(),member.end());
member.insert(member.begin(),id_map_r[it->first]);
ret.push_back(member);
}
return ret;
}
private:
map<string,int>id_mp;//id-序号映射;
map<int,string>id_map_r;//id-名字对应;
map<int,string>id_name;
map<int,vector<string>>root_childen;//根节点对应的名称;
vector<int>fa;
};