851. 喧闹和富有

在一组 N 个人(编号为 0, 1, 2, ..., N-1)中,每个人都有不同数目的钱,以及不同程度的安静(quietness)。

为了方便起见,我们将编号为 x 的人简称为 "person x "。

如果能够肯定 person x 比 person y 更有钱的话,我们会说 richer[i] = [x, y] 。注意 richer 可能只是有效观察的一个子集。

另外,如果 person x 的安静程度为 q ,我们会说 quiet[x] = q 。

现在,返回答案 answer ,其中 answer[x] = y 的前提是,在所有拥有的钱不少于 person x 的人中,person y 是最安静的人(也就是安静值 quiet[y] 最小的人)。

示例:

输入:richer = [[1,0],[2,1],[3,1],[3,7],[4,3],[5,3],[6,3]], quiet = [3,2,5,4,6,1,7,0]
输出:[5,5,2,5,4,5,6,7]
解释: 
answer[0] = 5,
person 5 比 person 3 有更多的钱,person 3 比 person 1 有更多的钱,person 1 比 person 0 有更多的钱。
唯一较为安静(有较低的安静值 quiet[x])的人是 person 7,
但是目前还不清楚他是否比 person 0 更有钱。

answer[7] = 7,
在所有拥有的钱肯定不少于 person 7 的人中(这可能包括 person 3,4,5,6 以及 7),
最安静(有较低安静值 quiet[x])的人是 person 7。

其他的答案也可以用类似的推理来解释。
提示:

1 <= quiet.length = N <= 500
0 <= quiet[i] < N,所有 quiet[i] 都不相同。
0 <= richer.length <= N * (N-1) / 2
0 <= richer[i][j] < N
richer[i][0] != richer[i][1]
richer[i] 都是不同的。
对 richer 的观察在逻辑上是一致的。

思路:

用图的思想,每个人与比他更加富有的人建立有向边,然后广度优先遍历,去记录重复的值,如果遇到重复了就直接比较之前算过的结果。其实还能再优化的,每次根据遍历的情况更新res数组这样还能减少运算量。对问题的建模还是很重要的。具体实现如下。

class Solution {
public:
    vector<int> loudAndRich(vector<vector<int>>& richer, vector<int>& quiet) {
        int len=quiet.size();
        vector<unordered_set<int>> graph(len);
        vector<int> res(len,-1);
        queue<int> que;
        for(auto v:richer)
        {
            graph[v[1]].insert(v[0]);
        }
        for(int i=0;i<len;i++)
        {
            
            que.push(i);
            int minq=-1;
            while(!que.empty())
            {
                int curr=que.front();
                que.pop();
                if(res[curr]!=-1)
                {
                    if(minq==-1 || quiet[res[curr]]<quiet[minq])
                        minq=res[curr];
                }
                else
                {
                    for(auto e:graph[curr])
                    {
                        que.push(e);
                        cout<<e<<" ";
                    }
                    if(minq==-1 || quiet[minq]>quiet[curr])
                        minq=curr;
                }
            }
            res[i]=minq;
        }
        return res;
    }
};
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • "use strict";function _classCallCheck(e,t){if(!(e instanc...
    久些阅读 2,129评论 0 2
  • rljs by sennchi Timeline of History Part One The Cognitiv...
    sennchi阅读 7,813评论 0 10
  • sì 支zhī茶chá 对duì 酒jiǔ,赋fù 对duì 诗shī,燕yàn子zi 对duì 莺yīng 儿é...
    每个人的孟母堂阅读 1,427评论 0 6
  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 3,983评论 0 2
  • 我不是荷西 你不是三毛 但我想我们 和他们一样 你知道世上最大的河是什么吗? 是我对你的爱和思念,一点一点,一点一...
    我要成为小巨人阅读 272评论 0 0

友情链接更多精彩内容