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之路的主要内容,如果未能解决你的问题,请参考以下文章

后序遍历的优秀例题——851. 喧闹和富有

LeetCode 807. 保持城市天际线 / 630. 课程表 III(贪心+优先队列)/ 851. 喧闹和富有(拓扑排序)

851. 喧闹和富有

leetcode刷题总结851-900

从喧闹与富有中搞懂搜索和拓扑

从喧闹与富有中搞懂搜索和拓扑