2115. Find All Possible Recipes from Given Supplies

77 阅读1分钟

image.png

优化

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) {

        // 提供的原料入度都为0
        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); // 一开始supplies的入度为0,全加进去
        }

        List<String> res = new ArrayList<>();

        while (!queue.isEmpty()) {
            String cur = queue.poll();
            if (graph.containsKey(cur)) {// 多余的原料,不会出现在graph中
                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;
    }
}