Loud and Rich
Link
Description
There is a group of n
people labeled from 0
to n - 1
where each person has a different amount of money and a different level of quietness.
You are given an array richer
where richer[i] = [ai, bi]
indicates that ai
has more money than bi
and an integer array quiet where quiet[i]
is the quietness of the i
-th person. All the given data in richer are logically correct (i.e., the data will not lead you to a situation where x
is richer than y
and y
is richer than x
at the same time).
Return an integer array 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 the 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 is not 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.
|
Example 2:
- Input:
richer = [], quiet = [0]
- Output:
[0]
Constraints:
n == quiet.length
1 <= n <= 500
0 <= quiet[i] < n
- All the values of
quiet
are unique.
0 <= richer.length <= n * (n - 1) / 2
0 <= ai, bi < n
ai != bi
- All the pairs of
richer
are unique.
- The observations in
richer
are all logically consistent.
Solution
Topological Sort
See reference (Chinese).
| class Solution {
public:
vector<int> loudAndRich(vector<vector<int>>& richer, vector<int>& quiet) {
int n = quiet.size();
vector<vector<int>> edges(n);
vector<int> inDegree(n, 0);
for (const auto& edge : richer) {
edges[edge[0]].push_back(edge[1]);
inDegree[edge[1]]++;
}
queue<int> que;
for (int i = 0; i < n; i++) {
if (inDegree[i] == 0)
que.push(i);
}
vector<int> res(n);
for (int i = 0; i < n; i++)
res[i] = i;
while (!que.empty()) {
int current = que.front();
que.pop();
for (auto v : edges[current]) {
if (quiet[res[current]] < quiet[res[v]])
res[v] = res[current];
if (--inDegree[v] == 0)
que.push(v);
}
}
return res;
}
};
|
DFS
| class Solution {
private:
void dfs(int u, vector<int>& res, const vector<vector<int>>& edges, const vector<int>& quiet) {
if (res[u] != -1) return;
res[u] = u;
for (int vertex : edges[u]) {
dfs(vertex, res, edges, quiet);
if (quiet[res[u]] > quiet[res[vertex]])
res[u] = res[vertex];
}
}
public:
vector<int> loudAndRich(vector<vector<int>>& richer, vector<int>& quiet) {
int n = quiet.size();
vector<vector<int>> edges(n);
for (const auto& edge : richer)
edges[edge[1]].push_back(edge[0]);
vector<int> res(n, -1);
for (int i = 0; i < n; i++)
dfs(i, res, edges, quiet);
return res;
}
};
|