LC 851. Loud and Rich
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 <= quiet.length = N <= 5000 <= quiet[i] < N, allquiet[i]are different.0 <= richer.length <= N * (N-1) / 20 <= richer[i][j] < Nricher[i][0] != richer[i][1]richer[i]'s are all different.- The observations in
richerare 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的更多相关文章
- 851. Loud and Rich —— weekly contest 87
851. Loud and Rich 题目链接:https://leetcode.com/problems/loud-and-rich/description/ 思路:有向图DFS,记录最小的quie ...
- 【LeetCode】851. Loud and Rich 解题报告(Python)
[LeetCode]851. Loud and Rich 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http:// ...
- [LeetCode] Loud and Rich 聒噪与富有
In a group of N people (labelled 0, 1, 2, ..., N-1), each person has different amounts of money, and ...
- [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 ...
- [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 ...
- 算法与数据结构基础 - 深度优先搜索(DFS)
DFS基础 深度优先搜索(Depth First Search)是一种搜索思路,相比广度优先搜索(BFS),DFS对每一个分枝路径深入到不能再深入为止,其应用于树/图的遍历.嵌套关系处理.回溯等,可以 ...
- All LeetCode Questions List 题目汇总
All LeetCode Questions List(Part of Answers, still updating) 题目汇总及部分答案(持续更新中) Leetcode problems clas ...
- Swift LeetCode 目录 | Catalog
请点击页面左上角 -> Fork me on Github 或直接访问本项目Github地址:LeetCode Solution by Swift 说明:题目中含有$符号则为付费题目. 如 ...
- 【LeetCode】深搜DFS(共85题)
[98]Validate Binary Search Tree [99]Recover Binary Search Tree [100]Same Tree [101]Symmetric Tree [1 ...
随机推荐
- php--常见算法3
<?php function leijia($number){ $arr=[]; for($i=1;$i<=$number;$i++) { for($j=1;$j<=$number; ...
- mongodb启用auth,使用密码登录
更新操作: db.users.update({'currentVersion':3},{$set:{'currentVersion':5}}) 首先安装下载(略过) mongod 启动服务,有多重启动 ...
- springboot项目logback.xml或者logback-spring.xml中读取不到application.yml或application.properties配置文件中的配置解决办法
在springboot项目中我们可能想要实现不同环境的日志项目配置不同,比如我想让不同环境的日志路径不同. 这时候我们很容易想: 1.到将日志路径配置在springboot的:application- ...
- Samba passwd smbpasswd and tdbsam
ome commands to convert samba backend password-databases. If you use "passdb backend = smbpassw ...
- LeetCode NO477.汉明距离总和
两个整数的 汉明距离 指的是这两个数字的二进制数对应位不同的数量. 计算一个数组中,任意两个数之间汉明距离的总和. 示例: 输入: 4, 14, 2 输出: 6 解释: 在二进制表示中,4表示为010 ...
- 第六章 组件 67 使用ref获取DOM元素和组件引用
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8&quo ...
- flutter 记录正则匹配
手机号正则匹配: // 正则匹配 static bool isChinaPhoneLegal(String str) { return new RegExp('^((13[0-9])|(15[^4]) ...
- Linux的信号管理
man 7 signal #查看信号的实用信息 常用的信号: 信号名 编号 含义SIGHUP 1 无须关闭进程而让其重读配置文件SIGINT 2 ...
- IDEA 使用LiveEdit插件
第一步: 第二步: 第三步: 第四步: 等待下载完成 第五步: 第六步: 第七步: 配置tomcat时注意选择chrome浏览器,并勾选右边的多选框 完成之后,就可以启动项目了,然后可以改变html代 ...
- ESP8266_04管脚控制与软件定时器
ESP8266_04管脚控制与软件定时器 from :https://mp.weixin.qq.com/s/APawDx4io4gKJyOeuErTLA 原创: MCU启航 单片机爱好者 今天 这一节 ...