Back to all solutions

#851 - Loud and Rich

Problem 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 ith 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.

Solution

/**
 * @param {number[][]} richer
 * @param {number[]} quiet
 * @return {number[]}
 */
var loudAndRich = function(richer, quiet) {
  const graph = new Array(quiet.length).fill().map(() => []);
  const result = new Array(quiet.length).fill(-1);

  for (const [a, b] of richer) {
    graph[b].push(a);
  }

  function dfs(person) {
    if (result[person] !== -1) return result[person];

    let quietestPerson = person;

    for (const richerPerson of graph[person]) {
      const candidate = dfs(richerPerson);
      if (quiet[candidate] < quiet[quietestPerson]) {
        quietestPerson = candidate;
      }
    }

    result[person] = quietestPerson;
    return quietestPerson;
  }

  for (let i = 0; i < quiet.length; i++) {
    dfs(i);
  }

  return result;
};