5947. 从给定原材料中找到所有可以做出的菜

5947. 从给定原材料中找到所有可以做出的菜

1. 题意

给定 一维数组 recipes 表示菜谱,二维数组 ingredients 每道菜的原材料, 一维数组 supplies 提供的材料,找出能做出的所有菜。

输入:recipes = [“bread”], ingredients = [[“yeast”,“flour”]], supplies = [“yeast”,“flour”,“corn”]
输出:[“bread”]
解释:我们可以做出 “bread” ,因为我们有原材料 “yeast” 和 “flour” 。


2. 算法

哈希表 + 拓扑排序

3. 思路

  1. 建图。用hash存储,对于给定的菜谱,我们可以建边,从这道菜的原材料向这道菜连边,而菜谱入度++。
  2. topsort。 先将已有的原材料入队。在图中跑一遍拓排,原材料连向的点入度- -,那么,对于每道菜,如果入度为 0 则表明可以做成,并且当作已有原材料入队,入答案数组。
  3. 具体细节,见代码注释~~

代码

class Solution {
public:
    vector<string> findAllRecipes(vector<string>& recipes, vector<vector<string>>& ingredients, vector<string>& supplies) {
        int n = recipes.size();
        unordered_map<string, vector<string>> mp; // 图
        unordered_map<string, int> d;  // 入度
        for (int i = 0; i < n; i++) {
            for (auto &x: ingredients[i]) {
                // 原材料能提供的菜
                mp[x].push_back(recipes[i]);
            }
            // 菜入度 = 其原材料个数
            d[recipes[i]] = ingredients[i].size();
        }

        vector<string> ans; // 答案数组
        queue<string> q; // 队列
        // 初始材料入队
        for (auto &x : supplies) {
            q.push(x);
        }

        // topsort
        while(!q.empty()) {
            auto x = q.front();
            q.pop();
            if(mp.count(x)) {
                for (auto &y : mp[x]) {
                    // 入度为0, 说明能做出这道菜
                    if(--d[y] == 0) {
                        ans.push_back(y);
                        q.push(y);
                    }
                }
            }
        }
        return ans;

    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ღCauchyོꦿ࿐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值