文章目录

  • 1. 题目
  • 2. 解题

1. 题目

你有 n 道不同菜的信息。给你一个字符串数组 recipes 和一个二维字符串数组 ingredients 。
第 i 道菜的名字为 recipes[i] ,如果你有它 所有 的原材料 ingredients[i] ,那么你可以 做出 这道菜。一道菜的原材料可能是 另一道 菜,也就是说 ingredients[i] 可能包含 recipes 中另一个字符串。

同时给你一个字符串数组 supplies ,它包含你初始时拥有的所有原材料,每一种原材料你都有无限多

请你返回你可以做出的所有菜。你可以以 任意顺序 返回它们。

注意两道菜在它们的原材料中可能互相包含。

示例 1:
输入:recipes = ["bread"], ingredients = [["yeast","flour"]], supplies = ["yeast","flour","corn"]
输出:["bread"]
解释:
我们可以做出 "bread" ,因为我们有原材料 "yeast" 和 "flour" 。示例 2:
输入:recipes = ["bread","sandwich"], ingredients = [["yeast","flour"],["bread","meat"]], supplies = ["yeast","flour","meat"]
输出:["bread","sandwich"]
解释:
我们可以做出 "bread" ,因为我们有原材料 "yeast" 和 "flour" 。
我们可以做出 "sandwich" ,因为我们有原材料 "meat" 且可以做出原材料 "bread" 。示例 3:
输入:recipes = ["bread","sandwich","burger"], ingredients = [["yeast","flour"],["bread","meat"],["sandwich","meat","bread"]], supplies = ["yeast","flour","meat"]
输出:["bread","sandwich","burger"]
解释:
我们可以做出 "bread" ,因为我们有原材料 "yeast" 和 "flour" 。
我们可以做出 "sandwich" ,因为我们有原材料 "meat" 且可以做出原材料 "bread" 。
我们可以做出 "burger" ,因为我们有原材料 "meat" 且可以做出原材料 "bread" 和 "sandwich" 。示例 4:
输入:recipes = ["bread"], ingredients = [["yeast","flour"]], supplies = ["yeast"]
输出:[]
解释:
我们没法做出任何菜,因为我们只有原材料 "yeast" 。提示:
n == recipes.length == ingredients.length
1 <= n <= 100
1 <= ingredients[i].length, supplies.length <= 100
1 <= recipes[i].length, ingredients[i][j].length, supplies[k].length <= 10
recipes[i], ingredients[i][j] 和 supplies[k] 只包含小写英文字母。
所有 recipes 和 supplies 中的值互不相同。
ingredients[i] 中的字符串互不相同。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/find-all-possible-recipes-from-given-supplies
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

  • 拓扑排序问题,解决依赖先后顺序
class Solution {public:vector<string> findAllRecipes(vector<string>& recipes, vector<vector<string>>& ingredients, vector<string>& supplies) {unordered_map<string, unordered_set<string>> g;unordered_map<string, int> indegree;unordered_set<string> rset(recipes.begin(), recipes.end());for(auto& food : supplies)indegree[food] = 0;//初始材料的入度为0for(int i = 0; i < recipes.size(); ++i){for(auto& j : ingredients[i]){g[j].insert(recipes[i]);//建图indegree[recipes[i]]++;//记录入度}}queue<string> q;for(auto& p : indegree){if(p.second == 0)//入度为0的进入队列q.push(p.first);}vector<string> ans;while(!q.empty()){string food = q.front();q.pop();if(rset.find(food) != rset.end())ans.push_back(food);for(auto& nt : g[food]){if(--indegree[nt] == 0)//入度减1以后没有依赖了,进入队列q.push(nt);}}return ans;}
};

448 ms 154 MB C++


我的CSDN博客地址 https://michael.blog.csdn.net/

长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!

LeetCode 2115. 从给定原材料中找到所有可以做出的菜(拓扑排序)相关推荐

  1. 每天一道LeetCode-----在给定数组中找到一个子数组,使得这个子数组的元素乘积最大

    Maximum Product Subarray 原题链接Maximum Product Subarray 在给定数组中找到一个子数组,使得这个子数组元素的乘积最大.给定数组中可能有正数,负数和0 思 ...

  2. LeetCode 2192. 有向无环图中一个节点的所有祖先(拓扑排序)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个正整数 n ,它表示一个 有向无环图 中节点的数目,节点编号为 0 到 n - 1 (包括两者). 给你一个二维整数数组 edges ,其中 ed ...

  3. [LeetCode] 局部图论问题探讨-图成环、图度、关键路径、拓扑排序等问题

    写在前面 前面的笔记集分别探讨了图的遍历.图的最小路径和最小生成树问题,本笔记将着重探讨图中其他典型问题,比如图是否成环.图的度使用(无向图).图的入度和出度使用(有向图).图的关键路径和拓扑序问题, ...

  4. 每天一道LeetCode-----在给定序列中找到满足nums[i]nums[i-1]nums[i]nums[i+1]的位置,要求时间复杂度是O(logN)

    Find Peak Element 原题链接Find Peak Element 给定一个序列,找到一个位置i满足nums[i]>nums[i−1]&&nums[i]>num ...

  5. python找到一行单词中最长的_在Python的给定列表中找到k个最长的单词

    我们有一种情况,我们必须从包含许多长度不同的单词的列表中选择前n个最长的单词.在本文中,我们将看到实现这一目标的各种方法. 与count()和sorted() 我们首先以相反的顺序对列表中的元素进行排 ...

  6. [Leetcode][第329题][JAVA][矩阵中的最长递增路径][DFS][拓扑排序]

    [问题描述][中等] [解答思路] 1. 记忆化深度优先搜索 复杂度 class Solution {public int[][] dirs = {{-1, 0}, {1, 0}, {0, -1}, ...

  7. 对给定的AOV网络,产生所有的拓扑排序结果,并进行解法的动态演示

    数据结构 课程实验报告 实验题目: 33题,对给定的AOV网络,产生所有的拓扑排序结果,并进行解法的动态演示. 实验学时:一周 实验日期: 实验目的:对给定AOV网络,产生所有的拓扑排序结果,并进行动 ...

  8. 在给定总和K的二叉树中找到级别

    Description: 描述: The article describes how to find the level in a binary tree with given sum K? This ...

  9. Python程序从给定的N个数字中找到最大倍数

    Here, we will be framing code for finding the maximum multiple of a number x from a given set of a n ...

最新文章

  1. 阿里官方Redis开发规范!
  2. 语言 提取列名_学习健明老师发布的R语言练习题的学习笔记(二)
  3. React Native登录注册页面实现空白处收起键盘
  4. php编程查错,盘点PHP编程常见失误
  5. .NET Core Runtime vs .NET Framework Runtime
  6. PHP下拉框内容随单选框内容变化
  7. 推荐一款Silverlight数据列表控件----AgDataGrid
  8. java8计算两个日期之间的天数
  9. 防范项目中人员频繁变动的风险
  10. Web前端第一季(HTML):十四:课时 38 : 309-文本域完成大段文本的输入+课时 39 : 310-表单的属性+课时 40 : 311-文件上传
  11. JS工具类(一):DateUtil.js
  12. mysql的外文图书_外文数据库
  13. html页面去边框线,html中怎么去掉表格边框线的?
  14. 【odoo15】添加Chatter到表单视图,创建[发送消息][记录备注][安排活动]
  15. 深入Java集合ArrayList的源码解析
  16. 百度、华为、京东、B站最新面试题汇集,含泪整理面经
  17. java获取图片的长宽尺寸(毫米)
  18. Egg Dropping Puzzle问题的分析
  19. Trojan-Banker.Win32.Banker (2)
  20. 天啊!吃饭用的勺子都联网了~手把手带你DIY一款智能百味勺子

热门文章

  1. python去噪音_python中的噪声是什么意思
  2. php 获取字符串中的url,php使用正则表达式获取字符串中的URL
  3. 生动形象的理解什么是装饰器!
  4. 计算机表格复制粘贴后不变,excel表格复制粘贴后格式不变
  5. php 匹配双字节字符串,收集一些常用的正则表达式(匹配中文字符、匹配双字节字符、匹配HTML标记、匹配空行 and so on~~~)...
  6. java关闭一个窗口打开另一个_推开中式门窗,就像打开了另一个写意的世界…...
  7. Python--day 3
  8. 利用云计算打造政务信息化及应急指挥云平台
  9. JAVA 8 StreamAPI 和 lambda表达式 总结(一)--lambda表达式
  10. ACdream1157 Segments(CDQ分治 + 线段树)