LeetCode 851 喧闹和富有[dfs] HERODING的LeetCode之路
Posted HERODING23
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 851 喧闹和富有[dfs] HERODING的LeetCode之路相关的知识,希望对你有一定的参考价值。
解题思路:
一道阅读理解题,说白了就是返回每个人直接或者间接认识的比这个人富有的人中,最为安静的人的序号(如果没有就是自己),那么我们首先要维护一个二维数组,每行代表比第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)
以上是关于LeetCode 851 喧闹和富有[dfs] HERODING的LeetCode之路的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode 807. 保持城市天际线 / 630. 课程表 III(贪心+优先队列)/ 851. 喧闹和富有(拓扑排序)