【每日力扣中医养生】力扣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 注:本文中部分内容源自网络,第四步中部分来自本人曾经文章:云服务器安装配置宝塔面板并安装基础运行环境教程-星零岁的博客 今天来讲…...

idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...

Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...
SciencePlots——绘制论文中的图片
文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了:一行…...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...

el-switch文字内置
el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...
【生成模型】视频生成论文调研
工作清单 上游应用方向:控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...
【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案
目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后,迭代器会失效,因为顺序迭代器在内存中是连续存储的,元素删除后,后续元素会前移。 但一些场景中,我们又需要在执行删除操作…...
深度剖析 DeepSeek 开源模型部署与应用:策略、权衡与未来走向
在人工智能技术呈指数级发展的当下,大模型已然成为推动各行业变革的核心驱动力。DeepSeek 开源模型以其卓越的性能和灵活的开源特性,吸引了众多企业与开发者的目光。如何高效且合理地部署与运用 DeepSeek 模型,成为释放其巨大潜力的关键所在&…...
Python 高效图像帧提取与视频编码:实战指南
Python 高效图像帧提取与视频编码:实战指南 在音视频处理领域,图像帧提取与视频编码是基础但极具挑战性的任务。Python 结合强大的第三方库(如 OpenCV、FFmpeg、PyAV),可以高效处理视频流,实现快速帧提取、压缩编码等关键功能。本文将深入介绍如何优化这些流程,提高处理…...

uni-app学习笔记三十五--扩展组件的安装和使用
由于内置组件不能满足日常开发需要,uniapp官方也提供了众多的扩展组件供我们使用。由于不是内置组件,需要安装才能使用。 一、安装扩展插件 安装方法: 1.访问uniapp官方文档组件部分:组件使用的入门教程 | uni-app官网 点击左侧…...