2025每日刷题(231)
Leetcode---721. 账户合并

实现代码
cpp
class unionFind {
public:
unionFind(int n): id(n), sz(n, 1) {
iota(id.begin(), id.end(), 0);
}
void unionSize(const int& u, const int& v) {
const int x = find(u);
const int y = find(v);
if(x == y) {
return;
}
if(sz[x] < sz[y]) {
sz[y] += sz[x];
id[x] = y;
} else {
sz[x] += sz[y];
id[y] = x;
}
}
int find(const int &u) {
return id[u] == u? u: id[u] = find(id[u]);
}
private:
vector<int> id;
vector<int> sz;
};
class Solution {
public:
vector<vector<string>> accountsMerge(vector<vector<string>>& accounts) {
int n = accounts.size();
vector<vector<string>> ans;
// {email: index}
unordered_map<string, int> mailtoIndex;
// {index: {emails}}
unordered_map<int, set<string>> indextoMails;
unionFind uf(n);
for(int i = 0; i < n; ++i) {
const string& name = accounts[i][0];
for(int j = 1; j < accounts[i].size(); ++j) {
const string& email = accounts[i][j];
const auto& it = mailtoIndex.find(email);
if(it == mailtoIndex.end()) {
mailtoIndex[email] = i;
} else {
uf.unionSize(i, it->second);
}
}
}
for(const auto& [email, index]: mailtoIndex) {
indextoMails[uf.find(index)].insert(email);
}
for(const auto& [index, email]: indextoMails) {
const string& name = accounts[index][0];
vector<string> row{name};
row.insert(row.end(), email.begin(), email.end());
ans.push_back(row);
}
return ans;
}
};
运行结果

之后我会持续更新,如果喜欢我的文章,请记得一键三连哦,点赞关注收藏,你的每一个赞每一份关注每一次收藏都将是我前进路上的无限动力 !!!↖(▔▽▔)↗感谢支持!