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;
    }
};


相关文章
|
SQL 存储 OLAP
适用于即席查询(Ad-Hoc)的OLAP引擎
即席查询(Ad Hoc)是用户根据自己的需求,灵活的选择查询条件,OLAP系统根据用户输入的查询条件实时返回查询结果。OLAP的即席查询与普通查询的不同之处就是很难对前者进行预先的优化,因为即席查询所响应的大都是随机性很强的查询请求。一个OLAP系统的即席查询能力越强,其应对不同用户的随机性和探索性分析的能力就越强。
590 0
适用于即席查询(Ad-Hoc)的OLAP引擎
|
Linux 数据安全/隐私保护
linux 非交互式 修改密码 root 用户
linux 非交互式 修改密码 root 用户
236 0
|
运维 Java 程序员
Spring5深入浅出篇:基于注解实现的AOP
# Spring5 AOP 深入理解:注解实现 本文介绍了基于注解的AOP编程步骤,包括原始对象、额外功能、切点和组装切面。步骤1-3旨在构建切面,与传统AOP相似。示例代码展示了如何使用`@Around`定义切面和执行逻辑。配置中,通过`@Aspect`和`@Around`注解定义切点,并在Spring配置中启用AOP自动代理。 进一步讨论了切点复用,避免重复代码以提高代码维护性。通过`@Pointcut`定义通用切点表达式,然后在多个通知中引用。此外,解释了AOP底层实现的两种动态代理方式:JDK动态代理和Cglib字节码增强,默认使用JDK,可通过配置切换到Cglib
|
弹性计算
购买阿里云游戏联机服务器多少钱?
购买阿里云游戏联机服务器多少钱?4核16G服务器26元1个月、146元半年,游戏专业服务器8核32G配置90元一个月、271元3个月
542 0
|
NoSQL 关系型数据库 分布式数据库
2024上云采购季数据库分会场全攻略
2024年上云采购季活动,已于3月1日正式开启,开年采购,阿里云数据库普惠降价,助力企业和开发者开工复产,上云无忧。
639 28
|
安全 算法 测试技术
C#编程实战:项目案例分析
【4月更文挑战第20天】本文以电子商务系统为例,探讨C#在实际项目中的应用。通过面向对象编程实现组件抽象和封装,确保代码的可维护性和可扩展性;利用安全性特性保护用户数据;借助数据库操作处理商品信息;通过逻辑控制和算法处理订单;调试工具加速问题解决,展现C#的优势:面向对象、数据库交互、数据安全和开发效率。C#在实际编程中展现出广泛前景。
562 2
|
Rust 前端开发 JavaScript
前端技术发展趋势与应用前景分析
【2月更文挑战第8天】 随着互联网时代的不断发展,前端技术作为网页和移动端开发的核心领域,也在不断演进。本文将深入探讨前端技术的发展趋势与应用前景,分析当前热门技术及其在各行业中的应用,帮助读者更好地了解前端技术的现状与未来。
|
前端开发 JavaScript 开发工具
ruoyi-vue | electron打包教程(超详细)
ruoyi-vue | electron打包教程(超详细)
1974 1
|
存储 监控 Ubuntu
汽车以太网交换机的设计
汽车以太网交换机的设计
汽车以太网交换机的设计
|
JavaScript Java 关系型数据库
开源云真机平台Sonic版本升级实践
开源云真机平台sonic从1.5.0升级到最新的2.0.5版本实践记录
开源云真机平台Sonic版本升级实践

热门文章

最新文章