In a group of N people (labelled0, 1, 2, ..., N-1), each person has different amounts of money, and different levels of quietness.
For convenience, we'll call the person with labelx, simply "personx".
We'll say thatricher[i] = [x, y]if personx definitely has more money than person y. Note thatricher may only be a subset of valid observations.
Also, we'll sayquiet[x] = qif personx has quietnessq.
Now, returnanswer, whereanswer[x] = yifyis the least quiet person (that is, the personywith the smallest value ofquiet[y]), among all people who definitely have equal to or more money than personx.
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 <= 500
0 <= quiet[i] < N, all quiet[i] are different.
0 <= richer.length <= N * (N-1) / 2
0 <= richer[i][j] < N
richer[i][0] != richer[i][1]
richer[i]'s are all different.
The observations in richer are all logically consistent.
分析
DFS建图,比自己大的放list。dfs list里选quiet最小的。也是带memo的
简缩版
class Solution:
def loudAndRich(self, richer: List[List[int]], quiet: List[int]) -> List[int]:
g = collections.defaultdict(list)
for u,v in richer:
g[v].append(u)
n = len(quiet)
res = [-1]*n
def dfs(i):
if res[i] < 0:
res[i] = min([dfs(j) for j in g[i]] + [i], key = lambda x: quiet[x]) #不要忘了Key,也不要忘了加[i]自己。
return res[i]
return list(map(dfs, range(n))) #dfs没有()
扩展板DFS
class Solution:
def loudAndRich(self, richer: List[List[int]], quiet: List[int]) -> List[int]:
g = collections.defaultdict(list)
for u,v in richer:
g[v].append(u)
n = len(quiet)
res = [-1]*n
def dfs(i):
if res[i] >= 0:
return res[i]
res[i] = i
for j in g[i]:
if quiet[res[i]] > quiet[dfs(j)]:
res[i] = res[j]
return res[i]
return list(map(dfs, range(n))) #dfs没有()
BFS
富点跟一串穷点。富点入度0,topo排序
res[]里指向的是比他富切比他安静的人
class Solution:
def loudAndRich(self, richer: List[List[int]], quiet: List[int]) -> List[int]:
g = collections.defaultdict(list)
indegree = collections.defaultdict(int)
for u,v in richer:
g[u].append(v)
indegree[v] += 1
n = len(quiet)
res = [i for i in range(n)] #初始赋值为点本身
q = [i for i in range(n) if indegree[i] == 0]
while q:
cur = q.pop()
for nxt in g[cur]:
if quiet[res[nxt]] > quiet[res[cur]]:#quiet[res[nxt]] 不是直接quiet[nxt]
res[nxt] = res[cur]
indegree[nxt] -= 1
if indegree[nxt] == 0:
q.append(nxt)
return res