|
| 1 | +# 851. Loud and Rich |
| 2 | +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. |
| 3 | + |
| 4 | +You are given an array `richer` where <code>richer[i] = [a<sub>i</sub>, b<sub>i</sub>]</code> indicates that <code>a<sub>i</sub></code> has more money than <code>b<sub>i</sub></code> and an integer array `quiet` where `quiet[i]` is the quietness of the <code>i<sup>th</sup></code> 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). |
| 5 | + |
| 6 | +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`. |
| 7 | + |
| 8 | +#### Example 1: |
| 9 | +<pre> |
| 10 | +<strong>Input:</strong> richer = [[1,0],[2,1],[3,1],[3,7],[4,3],[5,3],[6,3]], quiet = [3,2,5,4,6,1,7,0] |
| 11 | +<strong>Output:</strong> [5,5,2,5,4,5,6,7] |
| 12 | +<strong>Explanation:</strong> |
| 13 | +answer[0] = 5. |
| 14 | +Person 5 has more money than 3, which has more money than 1, which has more money than 0. |
| 15 | +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. |
| 16 | +answer[7] = 7. |
| 17 | +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. |
| 18 | +The other answers can be filled out with similar reasoning. |
| 19 | +</pre> |
| 20 | + |
| 21 | +#### Example 2: |
| 22 | +<pre> |
| 23 | +<strong>Input:</strong> richer = [], quiet = [0] |
| 24 | +<strong>Output:</strong> [0] |
| 25 | +</pre> |
| 26 | + |
| 27 | +#### Constraints: |
| 28 | +* `n == quiet.length` |
| 29 | +* `1 <= n <= 500` |
| 30 | +* `0 <= quiet[i] < n` |
| 31 | +* All the values of `quiet` are **unique**. |
| 32 | +* `0 <= richer.length <= n * (n - 1) / 2` |
| 33 | +* <code>0 <= a<sub>i</sub>, b<sub>i</sub> < n</code> |
| 34 | +* <code>a<sub>i</sub> != b<sub>i</sub></code> |
| 35 | +* All the pairs of `richer` are **unique**. |
| 36 | +* The observations in `richer` are all logically consistent. |
| 37 | + |
| 38 | +## Solutions (Rust) |
| 39 | + |
| 40 | +### 1. Solution |
| 41 | +```Rust |
| 42 | +impl Solution { |
| 43 | + pub fn loud_and_rich(richer: Vec<Vec<i32>>, quiet: Vec<i32>) -> Vec<i32> { |
| 44 | + let n = quiet.len(); |
| 45 | + let mut richer_count = vec![0; n]; |
| 46 | + let mut poorer_people = vec![vec![]; n]; |
| 47 | + let mut people = vec![]; |
| 48 | + let mut answer = (0..n as i32).collect::<Vec<_>>(); |
| 49 | + |
| 50 | + for pair in &richer { |
| 51 | + richer_count[pair[1] as usize] += 1; |
| 52 | + poorer_people[pair[0] as usize].push(pair[1] as usize); |
| 53 | + } |
| 54 | + |
| 55 | + for i in 0..n { |
| 56 | + if richer_count[i] == 0 { |
| 57 | + people.push(i); |
| 58 | + } |
| 59 | + } |
| 60 | + |
| 61 | + while let Some(x) = people.pop() { |
| 62 | + for &y in &poorer_people[x] { |
| 63 | + richer_count[y] -= 1; |
| 64 | + if richer_count[y] == 0 { |
| 65 | + people.push(y); |
| 66 | + } |
| 67 | + if quiet[answer[x] as usize] < quiet[answer[y] as usize] { |
| 68 | + answer[y] = answer[x]; |
| 69 | + } |
| 70 | + } |
| 71 | + } |
| 72 | + |
| 73 | + answer |
| 74 | + } |
| 75 | +} |
| 76 | +``` |
0 commit comments