In a group of N people (labelled 0, 1, 2, ..., N-1), each person has different amounts of money, and different levels of quietness.

For convenience, we'll call the person with label x, simply "person x".

We'll say that richer[i] = [x, y] if person x definitely has more money than person y.  Note that richer may only be a subset of valid observations.

Also, we'll say quiet[x] = q if person x has quietness q.

Now, return answer, where answer[x] = y if y is the least quiet person (that is, the person y with the smallest value of quiet[y]), among all people who definitely have equal to or more money than person x.

Example 1:

Input: richer = [[1,0],[2,1],[3,1],[3,7],[4,3],[5,3],[6,3]], quiet = [3,2,5,4,6,1,7,0]
Output: [5,5,2,5,4,5,6,7]
Explanation:
answer[0] = 5.
Person 5 has more money than 3, which has more money than 1, which has more money than 0.
The only person who is quieter (has lower quiet[x]) is person 7, but
it isn't clear if they have more money than person 0. answer[7] = 7.
Among all people that definitely have equal to or more money than person 7
(which could be persons 3, 4, 5, 6, or 7), the person who is the quietest (has lower quiet[x])
is person 7. The other answers can be filled out with similar reasoning.

Note:

  1. 1 <= quiet.length = N <= 500
  2. 0 <= quiet[i] < N, all quiet[i] are different.
  3. 0 <= richer.length <= N * (N-1) / 2
  4. 0 <= richer[i][j] < N
  5. richer[i][0] != richer[i][1]
  6. richer[i]'s are all different.
  7. The observations in richer are all logically consistent.

Runtime: 120 ms, faster than 8.56% of C++ online submissions for Loud and Rich.

class Solution {
public:
vector<int> loudAndRich(vector<vector<int>>& richer, vector<int>& quiet) {
int n = quiet.size();
vector<int> ret(n,);
for(int i=; i<n; i++) ret[i] = i;
vector<unordered_set<int>> graph(quiet.size());
vector<unordered_set<int>> revgraph(quiet.size());
for(int i=; i<richer.size(); i++){
graph[richer[i][]].insert(richer[i][]);
}
for(int i=; i<richer.size(); i++){
revgraph[richer[i][]].insert(richer[i][]);
}
queue<int> q;
for(int i=; i<n; i++){
if(revgraph[i].empty()) q.push(i);
}
while(!q.empty()){
int node = q.front(); q.pop();
for(auto it=graph[node].begin(); it!=graph[node].end(); it++){
int childnode = *it;
ret[childnode] = quiet[ret[node]] > quiet[ret[childnode]] ? ret[childnode] : ret[node];
revgraph[childnode].erase(node);
if(revgraph[childnode].empty()) q.push(childnode);
}
}
return ret;
}
};

还有一种dfs的做法,速度要快很多,因为没有用到字典删除。而且还有这一句话

auto __  = []() {std::ios::sync_with_stdio(false); return ;}();
auto __ =[]() { std::ios::sync_with_stdio(false); cin.tie(nullptr); return nullptr; }();
void dfs(vector<vector<int>> & graph,vector<int> & go,vector<int> & retv,vector<int>quiets,int index)
{
int quiet = quiets[index];
go[index] = ;
retv[index] = index;
for(int i=;i<graph[index].size();i++)
{
if(go[graph[index][i]])
{
int person = retv[graph[index][i]];
if(quiet>quiets[person])
{
quiet = quiets[person];
retv[index] = person;
}
}
else
{
dfs(graph,go,retv,quiets,graph[index][i]);
int person = retv[graph[index][i]];
if(quiet>quiets[person])
{
quiet = quiets[person];
retv[index] = person;
}
}
}
}
class Solution {
public:
vector<int> loudAndRich(vector<vector<int>>& richer, vector<int>& quiet) {
vector<vector<int>> graph(quiet.size(),vector<int>());
if(quiet.size() == )
return vector<int>();
for(auto ele:richer)
{
graph[ele[]].push_back(ele[]);
}
vector<int> go(quiet.size(),);
vector<int> retv(quiet.size(),);
for(int i =;i<quiet.size();i++)
{
if(go[i]==)
{
dfs(graph,go,retv,quiet,i);
}
}
return retv;
}
};

LC 851. Loud and Rich的更多相关文章

  1. 851. Loud and Rich —— weekly contest 87

    851. Loud and Rich 题目链接:https://leetcode.com/problems/loud-and-rich/description/ 思路:有向图DFS,记录最小的quie ...

  2. 【LeetCode】851. Loud and Rich 解题报告(Python)

    [LeetCode]851. Loud and Rich 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http:// ...

  3. [LeetCode] Loud and Rich 聒噪与富有

    In a group of N people (labelled 0, 1, 2, ..., N-1), each person has different amounts of money, and ...

  4. [Swift]LeetCode851. 喧闹和富有 | Loud and Rich

    In a group of N people (labelled 0, 1, 2, ..., N-1), each person has different amounts of money, and ...

  5. [LeetCode] 851. Loud and Rich_ Medium tag: DFS

    In a group of N people (labelled 0, 1, 2, ..., N-1), each person has different amounts of money, and ...

  6. 算法与数据结构基础 - 深度优先搜索(DFS)

    DFS基础 深度优先搜索(Depth First Search)是一种搜索思路,相比广度优先搜索(BFS),DFS对每一个分枝路径深入到不能再深入为止,其应用于树/图的遍历.嵌套关系处理.回溯等,可以 ...

  7. All LeetCode Questions List 题目汇总

    All LeetCode Questions List(Part of Answers, still updating) 题目汇总及部分答案(持续更新中) Leetcode problems clas ...

  8. Swift LeetCode 目录 | Catalog

    请点击页面左上角 -> Fork me on Github 或直接访问本项目Github地址:LeetCode Solution by Swift    说明:题目中含有$符号则为付费题目. 如 ...

  9. 【LeetCode】深搜DFS(共85题)

    [98]Validate Binary Search Tree [99]Recover Binary Search Tree [100]Same Tree [101]Symmetric Tree [1 ...

随机推荐

  1. DBSCAN算法及sklearn实现

    基本概念:(Density-Based Spatial Clustering of Application with Noiso) 1.核心对象: 若某个点的密度达到算法设定的阈值则其为核心点.(即r ...

  2. java8 stream().map().collect()用法

    有一个集合: List<User> users = getList(); //从数据库查询的用户集合 现在想获取User的身份证号码:在后续的逻辑处理中要用: 常用的方法我们大家都知道,用 ...

  3. URL编码以及GET和POST提交乱码解决方案 (转)

    1.  什么是URL编码. URL编码是一种浏览器用来打包表单输入的格式,浏览器从表单中获取所有的name和其对应的value,将他们以name/value编码方式作为URL的一部分或者分离的发送到服 ...

  4. tensorflow2.0 在pycharm下提示问题

    tensorflow2.0 使用keras一般通过tensorflow.keras来使用,但是pycharm没有提示,原因是因为实际的keras路径放在tensorflow/python/keras, ...

  5. Java开发必备技能!Eclipse快捷方式助力提升开发效率

    插件开发快捷方式 注意:包括org.eclipse.pde.runtime插件,用于Plug-in Spy功能. Shift + Alt + F1—Plug-in Selection Spy. Shi ...

  6. hive传递参数与调用

    在运行hive命令时传入参数,使用-hivevar 和 -hiveconf 两种参数选项,来给此次的执行脚本传入参数 -hivevar : 传参数 ,专门提供给用户自定义变量. -hiveconf : ...

  7. Hadoop下MapReduce实现Pi值的计算

    Hadoop自带的例子中,有一个计算Pi值的例子. 这个程序的原理是这样的.假如有一个边长为1的正方形.以正方形的一个端点为圆心,以1为半径,画一个圆弧,于是在正方形内就有了一个直角扇形.在正方形里随 ...

  8. mysql优化(下)

    优化SQL语句:(1)不要使用   select  *(2)尽量在where字段上添加索引:(3)模糊查询中%前置不能使用索引,比如  like ‘%a’;(4)使用or语句时,两侧语句都有索引时才使 ...

  9. jquery keyup()方法 语法

    jquery keyup()方法 语法 作用:完整的 key press 过程分为两个部分,按键被按下,然后按键被松开并复位.当按钮被松开时,发生 keyup 事件.它发生在当前获得焦点的元素上.ke ...

  10. angular打包(三):pkg

    希望打包成1个web服务,运行exe,启动 angular,供浏览器显示. 问题分析: 其实angular编译后,都是静态文件了.只需要打包express,让express可以以exe的形式运行就可以 ...