leetcode-2115:从给定原材料中找到所有可以做出的菜

简介: leetcode-2115:从给定原材料中找到所有可以做出的菜

题目

题目连接

你有 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" 。

解题

方法一:暴力模拟

以现有的原料制作,把新做出来的菜,也添加到原料中,反复循环直到没有新的菜增加,就返回结果

class Solution {
public:
    vector<string> findAllRecipes(vector<string>& recipes, vector<vector<string>>& ingredients, vector<string>& supplies) {
        vector<string> res;
        unordered_set<string> set;
        for(string& s:supplies){//记录现有的原材料
            set.insert(s);
        }
        int preLen;//当前所有原材料的长度
        while(true){
            int preLen=set.size();
            for(int i=0;i<recipes.size();i++){
                if(set.count(recipes[i])) continue;
                vector<string> tmp=ingredients[i];
                bool ok=true;//如果为true说明可以做这道菜
                for(int j=0;j<tmp.size();j++){
                    if(!set.count(tmp[j])){
                        ok=false;
                        break;
                    }
                }
                if(ok){//如果本这次菜品可以做
                    set.insert(recipes[i]);//本次菜品添加为原材料
                    res.push_back(recipes[i]);//保存结果
                }
            }
            if(set.size()<=preLen) break;//如果原材料不再增加了,说明剩下的菜品都没法制作了
        }
        return res;
    }
};

方法二:拓扑排序

从原材料出发,当菜品对应的入度为0的时候,说明原材料齐全,把菜品再加入到原材料中。

得到入度为0的点,就是可以做的菜品。

class Solution {
public:
    vector<string> findAllRecipes(vector<string>& recipes, vector<vector<string>>& ingredients, vector<string>& supplies) {
        unordered_map<string,vector<string>> graph;
        unordered_map<string,int> indeg;
        int n=recipes.size();
        for(int i=0;i<n;i++){
            for(int j=0;j<ingredients[i].size();j++){
                graph[ingredients[i][j]].push_back(recipes[i]);
                indeg[recipes[i]]++;
            }
        }
        queue<string> q;
        for(string& s:supplies){
            q.push(s);
        }
        vector<string> res;
        while(!q.empty()){
            string x=q.front();
            q.pop();
            for(string& y:graph[x]){
                if(--indeg[y]==0){
                    q.push(y);
                    res.push_back(y);
                }
            }
        }
        return res;
    }
};
相关文章
|
存储 前端开发 JavaScript
SpringBoot2.x系列教程10--SpringBoot中对静态资源文件的配置处理
前言 在前面的章节中,壹哥 跟大家说过,现在Java中的项目,有的是前后端分离的,页面和静态资源都是分离出去的,与后端的Java代码都不在一起。当然也有一些前后端不分离的项目,页面和静态资源是与Java代码存放在一个jar或war包中的,那如果是SpringBoot开发的前后端不分离项目,对这些静态资源该如何处理呢? 啥?你别告诉我,你连静态资源是什么都不知道哦! 如果你对静态资源没有清晰的认识,那我就说一下吧。一般我们说的静态资源,指的是项目中用到的图片、js、css、纯html等资源。其实在SpringBoot中,对静态资源的访问有着比较好的支持,基本使用默认配置就能满足我们的开发需求
1162 0
|
27天前
|
人工智能 Linux API
阿里云+本地全平台部署OpenClaw|iMessage集成+千问/Coding Plan API+避坑指南
2026年,AI自动化框架OpenClaw(原Clawdbot)凭借云端+本地双部署、多模型兼容与iMessage深度集成能力,成为连接苹果生态与AI能力的核心工具。阿里云提供轻量服务器、ECS、计算巢三种一键部署方案,本地支持MacOS、Linux、Windows11全系统运行,搭配阿里云千问大模型、免费Coding Plan API,可实现iMessage消息收发、自然语言交互、任务自动化执行,满足个人效率管理、移动AI助手、轻量业务开发等场景需求。
274 19
|
2月前
|
域名解析 弹性计算 运维
阿里云轻量应用服务器38元起:搭建个人博客/WordPress流程指南
个人博客是展示才华、分享见解的重要平台。阿里云轻量应用服务器以简单易用、高性价比及一站式服务,为初学者提供了理想解决方案。当前,阿里云推出多项特惠活动,包括经济型e实例和u1实例等云服务器套餐,以及轻量应用服务器的超值优惠,满足不同用户需求。
|
4月前
|
弹性计算 人工智能 数据库
阿里云服务器活动参考:云服务器抢购、超值优选、优惠券都有,活动详情解析
阿里云目前有哪些云服务器活动?阿里云针对个人、学生和企业用户均推出了相关活动,活动既有云服务器抢购,也有超值优选,云服务器爆款直降和云工开物等,也有老友专属福利券包、学生无门槛券、通义万相优惠券等优惠券活动,每个活动的内容并不是完全一样的。本文就为大家整理汇总了目前比较热门的一些云服务器相关活动,以供大家了解最新的优惠相关政策。
|
7月前
|
SQL 关系型数据库 MySQL
三、Sqoop 全量导入核心命令
在大数据处理过程中,数据库表怎么高效导入到 Hadoop?这一篇我带大家实战讲解 Sqoop 全量导入 的用法,从基础命令到常用参数配置,再到导入到 HDFS、Hive 的各种格式案例,配合实操示例,帮你一步步掌握全量导入技巧。最后还有练习题,供大家动手巩固一下。
376 2
|
缓存 NoSQL Redis
Redis原理—2.单机数据库的实现
本文概述了Redis数据库的核心结构和操作机制。
Redis原理—2.单机数据库的实现
|
数据挖掘
高性能计算集群的主要应用场景
本文主要介绍弹性高性能计算集群的主要应用场景,您可以根据不同的应用场景配置不同的资源类型。
541 0
|
网络协议 网络安全 网络虚拟化
网络技术基础(13)——NAT网络地址转换
【3月更文挑战第2天】网络基础笔记(加班了几天,中途耽搁了,预计推迟6天),这篇借鉴了之前师兄的笔记,边听边记笔记实在是太慢了。
|
机器学习/深度学习 数据可视化 TensorFlow
NeRF系列(2):NeRF in the wild : Neural Radiance Fields for Unconstrained Photo Collections论文解读与公式推导
NeRF系列(2):NeRF in the wild : Neural Radiance Fields for Unconstrained Photo Collections论文解读与公式推导
1032 0

热门文章

最新文章