【每日力扣中医养生】力扣1298. 你能从盒子里获得的最大糖果数

1298. 你能从盒子里获得的最大糖果数
文章目录
- 【每日力扣&中医养生】力扣1298. 你能从盒子里获得的最大糖果数
- 题目描述
- 示例解析
- 示例 1
- 示例 2
- 算法思路
- 算法步骤
- 代码实现
- 复杂度分析
- 总结
【每日力扣&中医养生】力扣1298. 你能从盒子里获得的最大糖果数
《黄帝内经》的阴阳应象大论篇第五,提到了“酸胜甘”,所以,如果你觉得吃的东西齁甜,可以吃喝点酸的东西来减缓齁甜的感觉。
 
题目描述
在这个问题中,你拥有一些盒子。每个盒子包含以下四种信息:
- 状态 status[i]:一个整数,表示盒子i是否已经打开。如果是打开的,值为1,否则为0。
- 糖果数 candies[i]:一个整数,表示盒子i中包含的糖果数量。
- 钥匙 keys[i]:一个数组,表示打开盒子i后,可以获得的一些盒子的钥匙。每个元素表示对应盒子的下标。
- 内含盒子 containedBoxes[i]:一个数组,表示盒子i中包含的其他盒子的下标。
你还拥有一个初始盒子数组 initialBoxes,这个数组表示你当前已经获得的盒子。你可以从这些盒子开始,获取糖果,打开新的盒子,探索其中的内容。
你的目标是获取尽可能多的糖果数目。
示例解析
示例 1
输入:
status = [1, 0, 1, 0]
candies = [7, 5, 4, 100]
keys = [[], [], [1], []]
containedBoxes = [[1, 2], [3], [], []]
initialBoxes = [0]
输出:16
解释:
- 初始拥有盒子 0。你可以获得 7 个糖果,并找到盒子 1 和 2。
- 盒子 1 目前是关闭的,且没有对应钥匙,所以你打开盒子 2,获得 4 个糖果和盒子 1 的钥匙。
- 打开盒子 1,获得 5 个糖果和盒子 3。然而,盒子 3 没有对应的钥匙,保持关闭状态。
总结:最终你获得的糖果总数为 7 + 4 + 5 = 16。
示例 2
输入:
status = [1, 0, 0, 0, 0, 0]
candies = [1, 1, 1, 1, 1, 1]
keys = [[1, 2, 3, 4, 5], [], [], [], [], []]
containedBoxes = [[1, 2, 3, 4, 5], [], [], [], [], []]
initialBoxes = [0]
输出:6
解释:
- 初始拥有盒子 0。打开盒子 0 后,你可以获得所有其他盒子(1, 2, 3, 4, 5)及其对应的钥匙,并且打开它们,最终获取所有糖果。
总结:最终你获得的糖果总数为 6。
算法思路
解决这个问题的关键在于模拟打开盒子的过程,这个过程可以通过广度优先搜索(BFS)来实现。
算法步骤
-  初始化: - 使用一个队列 queue存放当前可以打开的盒子。
- 使用一个集合 opened存储已经打开的盒子,避免重复打开。
- 使用一个集合boxes_owned记录拥有的盒子,
- 使用集合 boxes_can_open存储可以打开的盒子,记录哪一些盒子拥有对应钥匙或者在status中为1。
 
- 使用一个队列 
-  处理初始盒子: - 将所有可以打开的初始盒子添加到队列中。
 
-  BFS遍历: - 遍历队列中的盒子,依次处理: - 获取盒子中的钥匙,查看是否拥有对应的盒子可以打开,如果可以打开,则打开并入队。
- 获取盒子中包含的其他盒子,查看是否可以打开,如果可以打开,则打开并入队。
 
 
- 遍历队列中的盒子,依次处理: 
-  循环结束: - 继续上述过程,直到队列为空,即所有能够打开的盒子都已处理完毕。
 
代码实现
以下是该算法的完整代码实现:
from collections import dequetrue = True
false = Falseclass Solution:def maxCandies(self, status, candies, keys, cboxes, initialBoxes):# 初始化队列与集合queue = deque()opened = set()boxes_owned = set()boxes_can_open = set(i for i, e in enumerate(status) if e == 1)total_candies = 0for box in initialBoxes:boxes_owned.add(box)if status[box] == 1:queue.append(box)opened.add(box)total_candies += candies[box]while queue:box = queue.popleft()  # 取出已经打开的盒子# 将获得的钥匙加入“可打开”集合,并检查是否有对应的未开启的盒子for key in keys[box]:boxes_can_open.add(key)if key not in opened and key in boxes_owned:queue.append(key)opened.add(key)  # 记录已打开盒子total_candies += candies[key]  # 获取糖果# 获取该盒子内部的其它盒子for cbox in cboxes[box]:boxes_owned.add(cbox)# 检查是否可以打开if  (cbox not in openedandcbox in boxes_can_open):queue.append(cbox)opened.add(cbox)  # 记录已打开盒子total_candies += candies[cbox]  # 获取糖果return total_candies复杂度分析
- 时间复杂度: O ( n ) O(n) O(n),其中 n n n 是盒子的数量。每个盒子最多处理一次,所有操作都是线性复杂度的。
- 空间复杂度: O ( n ) O(n) O(n),用于存储队列和集合的内存。
总结
在这个问题中,通过使用广度优先搜索(BFS)算法,我们能够模拟打开盒子和获取糖果的过程。整个过程的关键在于理解BFS算法中的入队操作,正确管理盒子的状态、钥匙以及盒子间的相互包含关系。
 如果在这些多重因素限制下依然能运用BFS算法解决问题,那么你一定已经很深入地理解了BFS算法的核心逻辑。
相关文章:
 
【每日力扣中医养生】力扣1298. 你能从盒子里获得的最大糖果数
1298. 你能从盒子里获得的最大糖果数 文章目录 【每日力扣&中医养生】力扣1298. 你能从盒子里获得的最大糖果数题目描述示例解析示例 1示例 2 算法思路算法步骤代码实现复杂度分析总结 【每日力扣&中医养生】力扣1298. 你能从盒子里获得的最大糖果数 《黄帝内经》的阴…...
 
大数据-81 Spark 安装配置环境 集群环境配置 超详细 三台云服务器
点一下关注吧!!!非常感谢!!持续更新!!! 目前已经更新到了: Hadoop(已更完)HDFS(已更完)MapReduce(已更完&am…...
C#创建一个自定义控件类
如果你希望在 TextBox 内部嵌入一个按钮,并且这个按钮用于打开文件选择对话框,可以创建一个自定义控件来实现这一功能。下面是一个示例,展示如何在 Windows 窗体应用程序中创建一个自定义控件,其中 Button 嵌入到 TextBox 内部。 …...
 
springboot牙科就诊管理系统--论文源码调试讲解
2 相关技术 2.1 MySQL数据库 本设计用到的数据库就是MySQL数据库[3],之所以用到这个数据库的原因很多。首先,从满足功能需求上面来讲,MySQL是符合的;其次,从学习程度来讲,MySQL相比其他数据库不管是从安装…...
 
CUDA+tensorflow+python+vscode在GPU下环境安装及问题汇总与解答
2024.8.14 因为要做深度学习,需要安装tensorflowgpu的环境,每次都搞不好整的很生气,本次将安装过程中参考的一些大佬的博客和安装过程中遇到的问题及解决方案总结一下,希望以后不要在这件事情上浪费时间。安装环境其实也没有想象中…...
 
24/8/14算法笔记 复习_逻辑回归sigmoid
import numpy as np import matplotlib.pyplot as pltdef sigmoid(x):return 1/(1np.exp(-x))x np.linspace(-5,5,100) y sigmoid(x)plt.plot(x,y,colorgreen) #损失函数 from sklearn import datasets from sklearn.linear_model import LogisticRegression from mpl_toolki…...
MySQL忘记/无root密码,强制修改root密码
MySQL忘记/无root密码,强制修改root密码_mysql无root密码登录后设置密码-CSDN博客 sudo vi /etc/mysql/my.cnf 添加如下内容: [mysqld] skip-grant-tablessudo service mysql restart mysql -u root -p use mysql; update mysql.user set authentica…...
探索 MongoDB 的 $currentDate:解决 TTL 时间不同步问题的利器
在我们日常的开发工作中,时间管理是一个非常重要的环节。尤其是在处理数据库中的数据时,时间戳的准确性和一致性至关重要。今天,我们要聊聊 MongoDB 中的一个神奇操作符——$currentDate,它是如何帮助我们解决 TTL(Tim…...
defineModel
前言 随着 Vue3.4 版本的发布,defineModel 也正式转正了。它可以简化父子组件之间的双向绑定,是目前官方推荐的双向绑定实现方式。 defineModel 使用 在开发的过程中,如果有需要通过子组件进行状态更新的话,v-model是一个绕不开…...
 
去中心化技术的崛起:探索Web3的新时代
引言: Web3是互联网发展的新阶段,它通过去中心化技术重新定义了数字世界的运作方式。这一新时代不仅带来了技术上的突破,也为社会互动和数据管理开辟了新的前景。本文将深入探讨Web3的核心技术、应用领域、全球影响以及面临的挑战࿰…...
GNU/Linux - copy_{to,from}_user: 用户和内核空间的内存互拷贝
copy_{to,from}_user 函数是 Linux 内核编程的基本组成部分。它用于将数据从用户空间复制到内核空间。在编写内核模块或使用设备驱动程序时,安全地处理用户空间和内核空间之间的数据传输对防止安全漏洞和确保系统稳定至关重要。 The copy_{to,from}_user function i…...
进阶岛任务1: 探索 InternLM 模型能力边界
任务 https://aicarrier.feishu.cn/wiki/QjBswYlmdiSGfskq6vNcBmZCn09 在 CompassArena 中选择双模型对话,与InternLM2.5及另外任意其他模型对话,收集 5 个 InternLM2.5 输出结果不如其他模型的对话案例,以及 InternLM2.5 的 5 个 Good Ca…...
 
RabbitMQ实现多线程处理接收消息
前言:在使用RabbitListener注解来指定消费方法的时候,默认情况是单线程去监听队列,但是这个如果在高并发的场景中会出现很多个任务,但是每次只消费一个消息,就会很缓慢。单线程处理消息容易引起消息处理缓慢࿰…...
 
AI智能网关 边缘计算 视觉AI
随着人工智能技术的不断发展,AI智能网关正成为连接现实世界和虚拟智能世界的重要桥梁。作为智能化时代的关键设备,AI智能网关在物联网、工业、市政、无人驾驶、农业、环保、水利等领域起到了至关重要的作用。 首先,AI智能网关是物联网的核…...
Java基础之原反补码
原反补码 学习这个知识点之前,我们先来看一个题目:写出10的二进制形式 答案及解读:  0b 0 0(23个) 0000 1010  10对应的类型为int,在计算机底层占4字节,需要32个比特位表示  其中最高位为符号位,0表…...
 
Unity如何使用Spine动画导出的动画
Unity如何使用Spine动画导出的动画 介绍使用版本Spine导出源文件修改Spine3.8.75版本导入Unity的3.8版本Spine的报错Unity辅助修改Json中版本号方式总结 介绍 最近公司在做抖音小程序的小游戏,我们这边动画部分使用的是spine动画,所以会有spine导入的问…...
变量位操作
对变量的某位取反 a ^(1<<2);//bit2取反 把变量的某位清零 a & ~(1<<2);//bit2清0 把变量的某位置1 a | (1<<2);//bit2置1...
 
内网渗透—横向移动RDPWinRMWinRSSPN扫描Kerberos攻击
前言 今天仍是横向移动的内容,有些实验能成功,有些实验则各种奇怪的问题导致失败,这都是很常见的。就连小迪在视频中也经常翻车,我们只需要知道原理,以及如何去实现这个攻击行为即可。没必要强求所有的实验都要百分百…...
 
Python套接字综合应用(UDP篇)
Python套接字综合应用(UDP篇) 1、 主要功能 UDP客户端实现UDP服务端实现输出字体颜色控制响应捕获键盘CtrlC信号套接字异常捕获及处理通信报文16进制格式化输出 2、 Python UDP套接字应用 Windows程序在WinServer2022上验证运行,Linux程序在银河麒麟V10上验证运…...
 
服务器安装哪吒面板详细教程
本文长期更新地址: 服务器安装哪吒面板详细教程-星零岁的博客https://blog.0xwl.com/13568.html 注:本文中部分内容源自网络,第四步中部分来自本人曾经文章:云服务器安装配置宝塔面板并安装基础运行环境教程-星零岁的博客 今天来讲…...
C++:std::is_convertible
C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...
 
《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...
五年级数学知识边界总结思考-下册
目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解:由来、作用与意义**一、知识点核心内容****二、知识点的由来:从生活实践到数学抽象****三、知识的作用:解决实际问题的工具****四、学习的意义:培养核心素养…...
 
《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)
宇树机器人多姿态起立控制强化学习框架论文解析 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一) 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...
 
3-11单元格区域边界定位(End属性)学习笔记
返回一个Range 对象,只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意:它移动的位置必须是相连的有内容的单元格…...
 
push [特殊字符] present
push 🆚 present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中,push 和 present 是两种不同的视图控制器切换方式,它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...
怎么让Comfyui导出的图像不包含工作流信息,
为了数据安全,让Comfyui导出的图像不包含工作流信息,导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo(推荐) 在 save_images 方法中,删除或注释掉所有与 metadata …...
BLEU评分:机器翻译质量评估的黄金标准
BLEU评分:机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域,衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标,自2002年由IBM的Kishore Papineni等人提出以来,…...
