Leetcode每日一题学习训练——Python3版(到达首都的最少油耗)

版本说明

当前版本号[20231205]。

版本修改说明
20231205初版

目录

文章目录

  • 版本说明
  • 目录
  • 到达首都的最少油耗
    • 理解题目
    • 代码思路
    • 参考代码

原题可以点击此 2477. 到达首都的最少油耗 前去练习。

到达首都的最少油耗

​ 给你一棵 n 个节点的树(一个无向、连通、无环图),每个节点表示一个城市,编号从 0n - 1 ,且恰好有 n - 1 条路。0 是首都。给你一个二维整数数组 roads ,其中 roads[i] = [ai, bi] ,表示城市 aibi 之间有一条 双向路

​ 每个城市里有一个代表,他们都要去首都参加一个会议。

​ 每座城市里有一辆车。给你一个整数 seats 表示每辆车里面座位的数目。

​ 城市里的代表可以选择乘坐所在城市的车,或者乘坐其他城市的车。相邻城市之间一辆车的油耗是一升汽油。

​ 请你返回到达首都最少需要多少升汽油。

示例 1:

img

输入:roads = [[0,1],[0,2],[0,3]], seats = 5
输出:3
解释:
- 代表 1 直接到达首都,消耗 1 升汽油。
- 代表 2 直接到达首都,消耗 1 升汽油。
- 代表 3 直接到达首都,消耗 1 升汽油。
最少消耗 3 升汽油。

示例 2:

img

输入:roads = [[3,1],[3,2],[1,0],[0,4],[0,5],[4,6]], seats = 2
输出:7
解释:
- 代表 2 到达城市 3 ,消耗 1 升汽油。
- 代表 2 和代表 3 一起到达城市 1 ,消耗 1 升汽油。
- 代表 2 和代表 3 一起到达首都,消耗 1 升汽油。
- 代表 1 直接到达首都,消耗 1 升汽油。
- 代表 5 直接到达首都,消耗 1 升汽油。
- 代表 6 到达城市 4 ,消耗 1 升汽油。
- 代表 4 和代表 6 一起到达首都,消耗 1 升汽油。
最少消耗 7 升汽油。

示例 3:

img

输入:roads = [], seats = 1
输出:0
解释:没有代表需要从别的城市到达首都。

提示:

  • 1 <= n <= 105
  • roads.length == n - 1
  • roads[i].length == 2
  • 0 <= ai, bi < n
  • ai != bi
  • roads 表示一棵合法的树。
  • 1 <= seats <= 105

理解题目

  1. 这个问题可以使用图的广度优先搜索(BFS)算法来解决。
  2. 广度优先搜索(BFS)算法是一种用于遍历或搜索树或图的算法。它从根节点开始,然后访问所有相邻的节点,然后再访问这些相邻节点的相邻节点,依此类推。
  3. 首先,我们需要创建一个邻接表来表示城市之间的道路关系。
  4. 然后,从首都开始进行BFS搜索,每次搜索时,将当前城市的汽油消耗累加到总油耗中,并更新每个城市的汽油消耗。
  5. 最后,返回到达首都的总油耗。

代码思路

  1. 它包含一个名为minimumFuelCost的方法,该方法接受两个参数:roads和seats。**roads是一个二维列表,表示城市之间的道路关系;seats是一个整数,表示每辆车的座位数。**方法的目的是计算到达首都所需的最少汽油量。

    ​ (该函数:minimumFuelCost是函数名;

    self是类实例的引用,表示这个函数是一个类的方法;

    (self, roads: List[List[int]], seats: int)是函数的参数列表,包括两个参数:

    ​ 一个是roads,类型为List[List[int]],表示一个二维整数列表

    ​ 另一个是seats,类型为int,表示一个整数。

    -> int表示这个函数的返回值类型是整数。)

     def minimumFuelCost(self, roads: List[List[int]], seats: int) -> int:
    
  2. 首先,代码创建了一个名为g的空列表,用于存储道路关系。然后,遍历roads列表,将每个城市的邻居添加到g中。

    [[] for i in range(len(roads) + 1)]表示创建一个长度为len(roads) + 1的列表;

    ​ 其中每个元素都是一个空列表。

    ​ 这样做的目的是为了让每个节点都有一个与之对应的邻接表,

    ​ 方便后续进行图的遍历和操作。)

       # 创建一个空的邻接表g,用于存储道路关系g = [[] for i in range(len(roads) + 1)]for e in roads:# 将道路的两个端点添加到对方的邻接表中g[e[0]].append(e[1])g[e[1]].append(e[0])res = 0  # 初始化结果变量为0
    
  3. 接下来,定义了一个名为dfs的内部函数,用于深度优先搜索。这个函数接受两个参数:**cur表示当前城市,fa表示当前城市的父节点。**在dfs函数中,首先初始化一个名为peopleSum的变量,表示当前城市及其代表的人数之和。

            def dfs(cur, fa):nonlocal res  # 声明res为非局部变量,以便在dfs函数中修改它peopleSum = 1  # 初始化当前节点的人数为1
    
  4. 然后,遍历当前城市的代表,如果代表不是父节点,则递归调用dfs函数,并将返回的人数累加到peopleSum中。同时,更新res变量,将其加上(peopleCnt + seats - 1) // seats的结果。最后,返回peopleSum。

     for ne in g[cur]:  # 遍历当前节点的所有代表if ne != fa:  # 如果代表不是父节点peopleCnt = dfs(ne, cur)  # 递归调用dfs函数,计算代表的人数peopleSum += peopleCnt  # 累加代表的人数到当前节点的人数res += (peopleCnt + seats - 1) // seats  # 更新结果变量,计算所需的汽油量return peopleSum  # 返回当前节点的人数
    
  5. 在主函数中,调用dfs函数,传入初始值0和-1。最后,返回res作为结果。

         dfs(0, -1)  # 从根节点开始调用dfs函数return res  # 返回结果变量

参考代码

class Solution:def minimumFuelCost(self, roads: List[List[int]], seats: int) -> int:g = [[] for i in range(len(roads) + 1)]for e in roads:g[e[0]].append(e[1])g[e[1]].append(e[0])res = 0def dfs(cur, fa):nonlocal respeopleSum = 1 for ne in g[cur]:if ne != fa:peopleCnt = dfs(ne, cur)peopleSum += peopleCntres += (peopleCnt + seats - 1) // seatsreturn peopleSumdfs(0, -1)return res

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/208330.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

倒计时模块复习

经典回顾倒计时 倒计时的基本布局介绍。 一个内容区域和一个输入区域&#xff0c;内容区域进行划分 直接使用flex布局会更快一点。 js代码 我们利用一下模块化思想&#xff0c;直接把获得时间这个功能写成一个函数。方便后续的调用 function getTime() {const date new Date…

MES管理系统通过哪些方面提升产品质量管理水平

在当今高度竞争的市场环境中&#xff0c;质量成为了企业生存和发展的关键因素。工厂作为生产产品的核心场所&#xff0c;其质量管理水平直接影响到产品的质量和企业的声誉。为了应对这一挑战&#xff0c;许多工厂引入了MES管理系统解决方案。本文将探讨MES管理系统如何帮助工厂…

【UE5】监控摄像头效果(上)

目录 效果 步骤 一、视角切换 二、摄像头画面后期处理 三、在场景中显示摄像头画面 效果 步骤 一、视角切换 1. 新建一个Basic关卡&#xff0c;添加第三人称游戏资源到项目浏览器 2. 新建一个Actor蓝图&#xff0c;这里命名为“BP_SecurityCamera” 打开“BP_Securit…

模电笔记。。。。

模电 2.8 蜂鸣器 按照蜂鸣器驱动方式分为有源蜂鸣器和无源蜂鸣器 有源的有自己的震荡电路&#xff0c;无源的要写代码控制。 里面有个线圈&#xff0c;相当于电感&#xff0c;储能&#xff0c;通直隔交。 蜂鸣器的参数&#xff1a;额定电压&#xff0c;工作电压&#xff0…

【CCF-B】1/2区,录用见刊极快!2个月录用!

计算机类 • 好刊解读 今天小编带来Taylor and Francis旗下计算机领域快刊&#xff0c;CCF-B类推荐的期刊解读&#xff0c;期刊审稿周期短&#xff0c;投稿友好&#xff0c;如您有投稿需求&#xff0c;可作为重点关注&#xff01;后文有相关领域真实发表案例&#xff0c;供您投…

防水,也不怕水。Mate X5是如何做到让你湿手湿屏也不影响操作的?

相信不少人都碰到过当手机屏幕存在小水珠时&#xff0c;触控变得不灵敏&#xff0c;或者出现“幽灵触屏”&#xff0c;指东打西的情况。 尤其是在洗澡、做饭&#xff0c;或者在户外遇到下雨天气时&#xff0c;如果打湿的手机收到重要聊天消息或者电话&#xff0c;却因为湿屏导…

生成fip.bin在Milkv-duo上跑rtthread的相关尝试,及其问题分析

前言 &#xff08;1&#xff09;PLCT实验室实习生长期招聘&#xff1a;招聘信息链接 &#xff08;2&#xff09;本来是想在Milkv-duo上跑rtthread的&#xff0c;做了很多努力&#xff0c;一直没有结果。虽然不知道最终能不能成功做出来&#xff0c;还是把自己的相关努力分享出来…

MDK官网如何下载stm32支持包

网站&#xff1a;https://www.keil.com/demo/eval/arm.htm 1 2 3点这个下载

基于Mint Mate 21.2 Victoria 的Anjuta安装与测试

序言 Linux mint mate 21.2 命名为 victoria 版&#xff0c;在vmware虚拟机中安装按提示默认安装即可&#xff0c;不做更多记录。mint mate的优点是稳定&#xff0c;窗口质感好。安装完成后&#xff0c;需要关注一些常用功能配置。主要有&#xff1a;显示器调整、桌面调整、工…

当然热门的原创改写改写大全【2023最新】

在信息时代&#xff0c;随着科技的不断发展&#xff0c;改写软件逐渐成为提高文案质量和写作效率的重要工具。本文将专心分享一些好用的改写软件&#xff0c;其中包括百度文心一言智能写作以及147SEO改写软件。这些工具不仅支持批量改写&#xff0c;而且在发布到各大平台后能够…

python爬取 HTTP_2 网站超时问题的解决方案

问题背景 在进行网络数据爬取时&#xff0c;使用 Python 程序访问支持 HTTP/2 协议的网站时&#xff0c;有时会遇到超时问题。这可能会导致数据获取不完整&#xff0c;影响爬虫程序的正常运行。 问题描述 在实际操作中&#xff0c;当使用 Python 编写的爬虫程序访问支持 HTT…

使用高防IP防护有哪些优势

高防IP是针对互联网服务器在遭受大流量的DDoS攻击后导致服务不可用的情况下&#xff0c;推出的付费增值服务&#xff0c;用户可以通过配置高防IP&#xff0c;将攻击流量引流到高防IP&#xff0c;确保源站的稳定可靠。高防IP相当于搭建完转发的服务器。 高防IP有两种接入方式&a…

Notepad安装

中文免安装版&#xff0c;下载解压即可。 NotepadV7.5.6 (访问密码: 1666)https://url48.ctfile.com/f/33868548-986668939-7a3316?p1666

Node-RED 设置登录权限

Node-RED 提供了内置的 “adminAuth” 功能&#xff0c;使你能够通过用户名和密码来保护对 Node-RED 编辑器的访问。本文将向你展示如何配置登录权限&#xff0c;以及一些相关的最佳实践。以下是设置登录权限的步骤&#xff1a; 步骤一&#xff1a;配置 AdminAuth 在 Node-RE…

react Hooks实现原理

Fiber 上篇文章fiber简单理解记录了react fiber架构&#xff0c;Hooks是基于fiber链表来实现的。阅读以下内容时建议先了解react fiber。 jsx -> render function -> vdom -> fiber树 -> dom vdom 转 fiber 的过程称为 recocile。diff算法就是在recocile这个过程…

LVS-DR+Keepalived+动静分离实验

架构图 解释一下架构&#xff0c;大概就是用Keepalived实现两台DR服务器的LVS负载均衡&#xff0c;然后后端服务器是两台Nginx服务器两台Tomcat服务器并且实现动静分离这个实验其实就是把 LVS-DRKeepalived 和 动静分离 给拼起来&#xff0c;真的是拼起来&#xff0c;两个部分…

Rtrofit+Rxjava网络请求封装

好几年前封装的框架一直没上传&#xff0c;趁现在升级写下。 简介Retrofit是android的网络请求库&#xff0c;是一个RESTful的HTTP网络请求框架的封装&#xff08;基于okhttp&#xff09;。它内部网络请求的工作&#xff0c;本质上是通过OkHttp完成&#xff0c;而Retrofit仅负责…

JVM虚拟机:执行Java程序并指定JVM参数

本文重点 在前面我们设置参数值的时候&#xff0c;需要在eclipse中的VM中进行参数设置&#xff0c;查询的时候需要先jps&#xff0c;然后jinfo。这里尝试动态的设置和查询&#xff0c;也就是说在运行程序的时候就对其进行设置&#xff0c;并且进行查询。 过程 为了确定参数修…

微信个人号机器人开发

简要描述&#xff1a; 取消消息接收 请求URL&#xff1a; http://域名地址/cancelHttpCallbackUrl 请求方式&#xff1a; POST 请求头Headers&#xff1a; Authorization&#xff1a;login接口返回Content-Type&#xff1a;application/json 无参数 返回数据&#xff…

MeteoInfo-Java解析与绘图教程

MeteoInfo-Java解析与绘图教程(四) 上文我们说到,将地图叠加在色斑图上,但大部分都是卫星绘图,现在开始讲解micaps数据绘图,同样也是更多自定义 配置 首先我们解析micaps数据,将之前学到的东西拿过来绘图 MeteoDataInfo meteoDataInfo new MeteoDataInfo(); meteoDataInfo.o…