
优化
class Solution {
public List<String> findAllRecipes(String[] recipes, List<List<String>> ingredients, String[] supplies) {
List<String> res = new ArrayList<>();
Queue<String> queue = new LinkedList<>();
for (String s : supplies) {
queue.offer(s);
}
while (!queue.isEmpty()) {
String cur = queue.poll();
for (int i = 0; i < recipes.length; i++) {
List<String> list = ingredients.get(i);
if (list.size() == 0) {
continue;
}
if (list.contains(cur)) {
list.remove(cur);
}
if (list.size() == 0) {
res.add(recipes[i]);
queue.offer(recipes[i]);
}
}
}
return res;
}
}
方法2 :拓扑排序, 太长了
class Solution {
public List<String> findAllRecipes(String[] recipes, List<List<String>> ingredients, String[] supplies) {
Map<String, Integer> inDegree = new HashMap<>();
for (String s : supplies) {
inDegree.put(s, 0);
}
Map<String, List<String>> graph = new HashMap<>();
for (int i = 0; i < recipes.length; i++) {
for (int j = 0; j < ingredients.get(i).size(); j++) {
String curIgdt = ingredients.get(i).get(j);
if (graph.containsKey(curIgdt)) {
graph.get(curIgdt).add(recipes[i]);
} else {
List<String> tmp = new ArrayList<>();
tmp.add(recipes[i]);
graph.put(curIgdt, tmp);
}
inDegree.put(recipes[i], inDegree.getOrDefault(recipes[i], 0) + 1);
}
}
Queue<String> queue = new LinkedList<>();
for (String s : supplies) {
queue.offer(s);
}
List<String> res = new ArrayList<>();
while (!queue.isEmpty()) {
String cur = queue.poll();
if (graph.containsKey(cur)) {
for (String s : graph.get(cur)) {
inDegree.put(s, inDegree.get(s) - 1);
if (inDegree.get(s) == 0) {
queue.offer(s);
res.add(s);
}
}
}
}
return res;
}
}