解题思路:
一道阅读理解题,说白了就是返回每个人直接或者间接认识的比这个人富有的人中,最为安静的人的序号(如果没有就是自己),那么我们首先要维护一个二维数组,每行代表比第i个人富有的人的序列号集合,接着对每个人进行dfs,寻找直接或者间接认识的富人中最安静的,并更新ans,代码如下:
class Solution {
public:
vector<int> ans;
vector<vector<int>> record;
vector<int> loudAndRich(vector<vector<int>>& richer, vector<int>& quiet) {
int n = quiet.size();
ans.resize(n, -1);
record.resize(n);
// 构建富有表
for(auto& r : richer) {
record[r[1]].push_back(r[0]);
}
for(int i = 0; i < n; i ++) {
dfs(i, quiet);
}
return ans;
}
void dfs(int i, vector<int>& quiet) {
// 已经更新过
if(ans[i] != -1) {
return;
}
ans[i] = i;
for(auto& r : record[i]) {
dfs(r, quiet);
if(quiet[ans[r]] < quiet[ans[i]]) {
ans[i] = ans[r];
}
}
}
};
还有一版无需全局变量的版本,在main函数内定义内置函数,代码如下:
class Solution {
public:
vector<int> loudAndRich(vector<vector<int>>& richer, vector<int>& quiet) {
int n = quiet.size();
vector<int> ans(n, -1);
vector<vector<int>> record(n);
// 构建富有表
for(auto& r : richer) {
record[r[1]].push_back(r[0]);
}
function<void(int)> dfs = [&](int i) {
// 已经更新过
if(ans[i] != -1) {
return;
}
ans[i] = i;
for(auto& r : record[i]) {
dfs(r);
if(quiet[ans[r]] < quiet[ans[i]]) {
ans[i] = ans[r];
}
}
};
for(int i = 0; i < n; i ++) {
dfs(i);
}
return ans;
}
};
时间复杂度:O(n + m),n是quiet长度,m是richer长度
空间复杂度:O(n + m)