LeetCode 2115. 从给定原材料中找到所有可以做出的菜(拓扑排序)
文章目录
- 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. 从给定原材料中找到所有可以做出的菜(拓扑排序)相关推荐
- 每天一道LeetCode-----在给定数组中找到一个子数组,使得这个子数组的元素乘积最大
Maximum Product Subarray 原题链接Maximum Product Subarray 在给定数组中找到一个子数组,使得这个子数组元素的乘积最大.给定数组中可能有正数,负数和0 思 ...
- LeetCode 2192. 有向无环图中一个节点的所有祖先(拓扑排序)
文章目录 1. 题目 2. 解题 1. 题目 给你一个正整数 n ,它表示一个 有向无环图 中节点的数目,节点编号为 0 到 n - 1 (包括两者). 给你一个二维整数数组 edges ,其中 ed ...
- [LeetCode] 局部图论问题探讨-图成环、图度、关键路径、拓扑排序等问题
写在前面 前面的笔记集分别探讨了图的遍历.图的最小路径和最小生成树问题,本笔记将着重探讨图中其他典型问题,比如图是否成环.图的度使用(无向图).图的入度和出度使用(有向图).图的关键路径和拓扑序问题, ...
- 每天一道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 ...
- python找到一行单词中最长的_在Python的给定列表中找到k个最长的单词
我们有一种情况,我们必须从包含许多长度不同的单词的列表中选择前n个最长的单词.在本文中,我们将看到实现这一目标的各种方法. 与count()和sorted() 我们首先以相反的顺序对列表中的元素进行排 ...
- [Leetcode][第329题][JAVA][矩阵中的最长递增路径][DFS][拓扑排序]
[问题描述][中等] [解答思路] 1. 记忆化深度优先搜索 复杂度 class Solution {public int[][] dirs = {{-1, 0}, {1, 0}, {0, -1}, ...
- 对给定的AOV网络,产生所有的拓扑排序结果,并进行解法的动态演示
数据结构 课程实验报告 实验题目: 33题,对给定的AOV网络,产生所有的拓扑排序结果,并进行解法的动态演示. 实验学时:一周 实验日期: 实验目的:对给定AOV网络,产生所有的拓扑排序结果,并进行动 ...
- 在给定总和K的二叉树中找到级别
Description: 描述: The article describes how to find the level in a binary tree with given sum K? This ...
- Python程序从给定的N个数字中找到最大倍数
Here, we will be framing code for finding the maximum multiple of a number x from a given set of a n ...
最新文章
- 阿里官方Redis开发规范!
- 语言 提取列名_学习健明老师发布的R语言练习题的学习笔记(二)
- React Native登录注册页面实现空白处收起键盘
- php编程查错,盘点PHP编程常见失误
- .NET Core Runtime vs .NET Framework Runtime
- PHP下拉框内容随单选框内容变化
- 推荐一款Silverlight数据列表控件----AgDataGrid
- java8计算两个日期之间的天数
- 防范项目中人员频繁变动的风险
- Web前端第一季(HTML):十四:课时 38 : 309-文本域完成大段文本的输入+课时 39 : 310-表单的属性+课时 40 : 311-文件上传
- JS工具类(一):DateUtil.js
- mysql的外文图书_外文数据库
- html页面去边框线,html中怎么去掉表格边框线的?
- 【odoo15】添加Chatter到表单视图,创建[发送消息][记录备注][安排活动]
- 深入Java集合ArrayList的源码解析
- 百度、华为、京东、B站最新面试题汇集,含泪整理面经
- java获取图片的长宽尺寸(毫米)
- Egg Dropping Puzzle问题的分析
- Trojan-Banker.Win32.Banker (2)
- 天啊!吃饭用的勺子都联网了~手把手带你DIY一款智能百味勺子
热门文章
- python去噪音_python中的噪声是什么意思
- php 获取字符串中的url,php使用正则表达式获取字符串中的URL
- 生动形象的理解什么是装饰器!
- 计算机表格复制粘贴后不变,excel表格复制粘贴后格式不变
- php 匹配双字节字符串,收集一些常用的正则表达式(匹配中文字符、匹配双字节字符、匹配HTML标记、匹配空行 and so on~~~)...
- java关闭一个窗口打开另一个_推开中式门窗,就像打开了另一个写意的世界…...
- Python--day 3
- 利用云计算打造政务信息化及应急指挥云平台
- JAVA 8 StreamAPI 和 lambda表达式 总结(一)--lambda表达式
- ACdream1157 Segments(CDQ分治 + 线段树)