LeetCode-851 喧嚣与富有
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/loud-and-rich
题目描述
有一组 n 个人作为实验对象,从 0 到 n - 1 编号,其中每个人都有不同数目的钱,以及不同程度的安静值(quietness)。为了方便起见,我们将编号为 x 的人简称为 "person x "。
给你一个数组 richer ,其中 richer[i] = [ai, bi] 表示 person ai 比 person bi 更有钱。另给你一个整数数组 quiet ,其中 quiet[i] 是 person i 的安静值。richer 中所给出的数据 逻辑自恰(也就是说,在 person x 比 person y 更有钱的同时,不会出现 person y 比 person x 更有钱的情况 )。
现在,返回一个整数数组 answer 作为答案,其中 answer[x] = y 的前提是,在所有拥有的钱肯定不少于 person x 的人中,person y 是最安静的人(也就是安静值 quiet[y] 最小的人)。
示例 1:
输入: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。
其他的答案也可以用类似的推理来解释。
示例 2:
输入:richer = [], quiet = [0]
输出:[0]
提示:
n == quiet.length
1 <= n <= 500
0 <= quiet[i] < n
quiet 的所有值 互不相同
0 <= richer.length <= n * (n - 1) / 2
0 <= ai, bi < n
ai != bi
richer 中的所有数对 互不相同
对 richer 的观察在逻辑上是一致的
解题思路
这是一道标准的拓扑排序题
通过richer表,可以得到一张富有程度的拓扑表,通过拓扑排序的思路迭代就可以得出结果。
首先根据richer表构建一个关系表,每行记录比自己贫穷的人,并且记录比自己富有的人的人数。
从最富有的人开始依次向贫穷的人迭代,更新喧嚣值。
一个优化的点是可以用队列来记录当前最富有的值的人来避免每次从vector查找比自己富有的人的时间损耗。
源码展示
未优化前:
class Solution {
public:
vector<int> loudAndRich(vector<vector<int>>& richer, vector<int>& quiet) {
vector<vector<int>> vviRelation(0);
vector<int> viRet;
vector<int> viCount;
vviRelation.resize(quiet.size());
viCount.resize(quiet.size(), 0);
for(int i = 0; i<quiet.size(); i++)
{
viRet.push_back(i);
}
for(auto person:richer)
{
vviRelation[person[0]].push_back(person[1]);
viCount[person[1]]++;
}
for(int i=0; i<quiet.size(); i++)
{
int iPos = find(viCount.begin(), viCount.end(), 0) - viCount.begin();
for(auto person :vviRelation[iPos])
{
if(quiet[iPos] < quiet[person])
{
viRet[person] = viRet[iPos];
quiet[person] = quiet[iPos];
}
viCount[person]--;
}
viCount[iPos]--;
}
return viRet;
}
};
优化后:
class Solution {
public:
vector<int> loudAndRich(vector<vector<int>>& richer, vector<int>& quiet) {
vector<vector<int>> vviRelation(0);
vector<int> viRet;
vector<int> viCount;
vviRelation.resize(quiet.size());
viCount.resize(quiet.size(), 0);
queue<int> qiVisiting;
for(int i = 0; i<quiet.size(); i++)
{
viRet.push_back(i);
}
for(auto person:richer)
{
vviRelation[person[0]].push_back(person[1]);
viCount[person[1]]++;
}
for(int i=0; i<quiet.size(); i++)
{
if(viCount[i] == 0)
{
qiVisiting.push(i);
}
}
while(!qiVisiting.empty())
{
int iPos = qiVisiting.front();
qiVisiting.pop();
for(auto person :vviRelation[iPos])
{
if(quiet[viRet[iPos]] < quiet[viRet[person]])
{
viRet[person] = viRet[iPos];
}
viCount[person]--;
if(viCount[person] == 0)
{
qiVisiting.push(person);
}
}
}
return viRet;
}
};
运行结果

LeetCode-851 喧嚣与富有的更多相关文章
- [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 ...
- [LeetCode] All questions numbers conclusion 所有题目题号
Note: 后面数字n表明刷的第n + 1遍, 如果题目有**, 表明有待总结 Conclusion questions: [LeetCode] questions conclustion_BFS, ...
- [LeetCode] questions conclustion_BFS, DFS
BFS, DFS 的题目总结. Directed graph: Directed Graph Loop detection and if not have, path to print all pat ...
- C#LeetCode刷题-深度优先搜索
深度优先搜索篇 # 题名 刷题 通过率 难度 98 验证二叉搜索树 22.2% 中等 99 恢复二叉搜索树 45.1% 困难 100 相同的树 48.1% 简单 101 对称二叉树 4 ...
- [LeetCode] 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 解题报告(Python)
[LeetCode]851. Loud and Rich 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http:// ...
- LeetCode最富有客户的资产总量
最富有客户的资产总量 题目描述 给你一个 m * n 的整数网格 accounts,其中 account[i][j]是第 i 位客户在第 j 家银行托管的资产数量.返回最富有客户所拥有的资产总量. 客 ...
- 边工作边刷题:70天一遍leetcode: day 85-1
Inorder Successor in BST 要点:这题要注意的是如果不是BST,没法从树结构上从root向那边找p,只能遍历.而根据BST,可以只走正确方向 如果不检查right子树,可以从ro ...
- Swift LeetCode 目录 | Catalog
请点击页面左上角 -> Fork me on Github 或直接访问本项目Github地址:LeetCode Solution by Swift 说明:题目中含有$符号则为付费题目. 如 ...
- All LeetCode Questions List 题目汇总
All LeetCode Questions List(Part of Answers, still updating) 题目汇总及部分答案(持续更新中) Leetcode problems clas ...
随机推荐
- MySQL空间暴涨150G导致锁定,发生了什么
背景 12月1号中午突然收到大量报警,某客户环境操作数据库大量失败,报错信息如下图所示: 这个报错我是第一次见,一时间有点无所适从,但是从字面意思来看是MySQL目前处于LOCK_WRITE_GROW ...
- 第一百一十四篇: JS数组Array(三)数组常用方法
好家伙,本篇为<JS高级程序设计>第六章"集合引用类型"学习笔记 1.数组的复制和填充 批量复制方法 copyWithin(),以及填充数组方法fill(). 这两 ...
- 洛谷P1434例题分析
[SHOI2002] 滑雪 题目描述 Michael 喜欢滑雪.这并不奇怪,因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你.Mic ...
- 第六节 FAF与GP不工作保护区的绘制
飞行程序设计软件实践 前一篇文章中,通过风标设计2023插件,我们在CAD中绘制了FAP方式下的精密进近保护区. 接着这个话题我们继续来看一下FAF方式下的保护区应该怎样绘制,以及OAS参数的其它用法 ...
- [OpenCV实战]44 使用OpenCV进行图像超分放大
图像超分辨率(Image Super Resolution)是指从低分辨率图像或图像序列得到高分辨率图像.图像超分辨率是计算机视觉领域中一个非常重要的研究问题,广泛应用于医学图像分析.生物识别.视频监 ...
- BBS升级版
BBS项目 项目的前期准备 1.django2.2 创建一个django目录 (需要配置环境变量和数据库) 'DIRS': [os.path.join(BASE_DIR, 'templates'), ...
- P4711 「化学」相对分子质量 代码
#include <bits/stdc++.h> using namespace std; double ret=0; namespace StringUtils { pair<st ...
- Vue ElementUI 修改MessageBox 弹框样式
1.情景还原 <template> <el-button type="text" @click="open">点击打开 Message ...
- 动力节点——day08
什么是集合,有什么用? 数组其实就是一个集合,集合实际上就是一个容器,可以用来容纳其他数据类型 集合为什么说在开发中使用最多? 集合是一个容器,是一个载体,可以一次容纳多个对象,在实际开发中,假设连接 ...
- 将Grafana嵌入自己的应用
什么是Grafana Grafana是一款强大的可视化工具,无论数据存储在哪里,都可以查询.可视化.警报和理解您的数据.使用Grafana,您可以通过美丽.灵活的仪表板创建.探索和共享所有数据. 场景 ...