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

news2024/11/24 22:30:42

版本说明

当前版本号[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 = 0
        def dfs(cur, fa):
            nonlocal res
            peopleSum = 1 
            for ne in g[cur]:
                if ne != fa:
                    peopleCnt = dfs(ne, cur)
                    peopleSum += peopleCnt
                    res += (peopleCnt + seats - 1) // seats
            return peopleSum
        dfs(0, -1)
        return res

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

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

相关文章

处理k8s中创建ingress失败

创建ingress&#xff1a; 如果在创建过程中出错了&#xff1a; 处理方法就是&#xff1a; kubectl get ValidatingWebhookConfiguration kubectl delete -A ValidatingWebhookConfiguration ingress-nginx-admission 然后再次创建&#xff0c;发现可以&#xff1a;

阿里云环境下的配置DNS和SLB的几种实践示例

一、背景 对于大多中小型公司来说&#xff0c;生产环境大多是购买阿里云或者腾讯云等等&#xff0c;也就存在以下需求&#xff1a; 外网域名内网域名SLB容器化部署 特别是前两项&#xff0c;一定是跳不过的。容器化部署&#xff0c;现在非K8S莫属了。 既然是购买阿里云&…

初级数据结构(一)——顺序表

文中代码源文件已上传&#xff1a;数据结构源码 1、顺序表的特点 1.1、数组 现实中数据记录一般都记录在表格中&#xff0c;如进货单、菜单等&#xff0c;它们的最大特点就是有序。表述中可以用第一项、第二项、第 n 项来描述表格中某个数据或者某串数据。在 C 语言中&#…

解决ssr服务端渲染程序启动报错: ReferenceError: location is not defined

现象&#xff1a; 原因&#xff1a;chatgpt给出的解释很到位&#xff1a; 该错误表明代码尝试访问 location 对象&#xff0c;该对象通常在浏览器环境中可用。 然而&#xff0c;你的服务器端代码正在 Node.js 环境中运行&#xff0c;而在这个环境中 location 对象未定义。 问…

Kafka 生产者 API 指南:深入理解生产者的实现与最佳实践

Kafka 是一个高性能、分布式的消息中间件系统&#xff0c;而其生产者 API 是连接应用程序与 Kafka 集群之间的纽带。本篇博客将深入探讨 Kafka 生产者 API 的核心概念、用法&#xff0c;以及一些最佳实践&#xff0c;帮助你更好地利用 Kafka 构建可靠的消息生产系统。 1. Kafk…

uniapp得app云打包问题

获取appid&#xff0c;具体可以查看详情 也可以配置图标&#xff0c;获取直接生成即可 发行 打包配置 自有证书测试使用时候不需要使用 编译打包 最后找到安装包apk安装到手机 打包前&#xff0c;图片命名使用要非中文&#xff0c;否则无法打包成功会报错

Kafka中的Topic

在Kafka中&#xff0c;Topic是消息的逻辑容器&#xff0c;用于组织和分类消息。本文将深入探讨Kafka Topic的各个方面&#xff0c;包括创建、配置、生产者和消费者&#xff0c;以及一些实际应用中的示例代码。 1. 介绍 在Kafka中&#xff0c;Topic是消息的逻辑通道&#xff0…

SpringBoot集成mail发送邮件

前言 发送邮件功能&#xff0c;借鉴 刚果商城&#xff0c;根据文档及项目代码实现。整理总结便有了此文&#xff0c;文章有不对的点&#xff0c;请联系博主指出&#xff0c;请多多点赞收藏&#xff0c;您的支持是我最大的动力~ 发送邮件功能主要借助 mail、freemarker以及rocke…

MQTT框架和使用

目录 MQTT框架 1. MQTT概述 1.1 形象地理解三个角色 1.2 消息的传递 2. 在Windows上体验MQTT 2.1 安装APP 2.2 启动服务器 2.3 使用MQTTX 2.3.1 建立连接 2.3.2 订阅主题 2.3.3 发布主题 2.4 使用mosquitto 2.4.1 发布消息 2.4.2 订阅消息 3. kawaii-mqtt源码分析…

STM32下载程序的五种方法

刚开始学习 STM32 的时候&#xff0c;很多小伙伴满怀热情买好了各种设备&#xff0c;但很快就遇到了第一个拦路虎——如何将写好的代码烧进去这个黑乎乎的芯片&#xff5e; STM32 的烧录方式多样且灵活&#xff0c;可以根据实际需求选择适合的方式来将程序烧录到芯片中。本文将…

ESP32-Web-Server编程-在网页中插入图片

ESP32-Web-Server编程-在网页中插入图片 概述 图胜与言&#xff0c;在网页端显示含义清晰的图片&#xff0c;可以使得内容更容易理解。 需求及功能解析 本节演示在 ESP32 Web 服务器上插入若干图片。在插入图片时还可以对图片设置一个超链接&#xff0c;用户点击该图片时&a…

go-fastfds部署心得

我是windows系统安装 Docker Desktop部署 docker run --name go-fastdfs&#xff08;任意的一个名称&#xff09; --privilegedtrue -t -p 3666:8080 -v /data/fasttdfs_data:/data -e GO_FASTDFS_DIR/data sjqzhang/go-fastdfs:lastest docker run&#xff1a;该命令用于运…

常见测试技术都有哪些?

测试技术是用于评估系统或组件的方法&#xff0c;目的是发现它是否满足给定的要求。系统测试有助于识别缺口、错误&#xff0c;或与实际需求不同的任何类型的缺失需求。测试技术是测试团队根据给定的需求评估已开发软件所使用的最佳实践。这些技术可以确保产品或软件的整体质量…

我想修改vCenter IP地址

部署vCenter Server Appliance后&#xff0c;您可以在vCenter修改DNS设置并选择域名服务器使用。您可以编辑vCenter Server Appliance的IP地址设置。从vSphere 6.5开始正式支持vCenter修改IP地址。因此可以更改vCenter Server Appliance的IP地址和DNS设置。 注意&#xff1a;更…

AI助力智慧农业,基于YOLOv3开发构建农田场景下的庄稼作物、田间杂草智能检测识别系统

智慧农业随着数字化信息化浪潮的演变有了新的定义&#xff0c;在前面的系列博文中&#xff0c;我们从一些现实世界里面的所见所想所感进行了很多对应的实践&#xff0c;感兴趣的话可以自行移步阅读即可&#xff1a; 《自建数据集&#xff0c;基于YOLOv7开发构建农田场景下杂草…

Javaweb之前端工程打包部署的详细解析

6 打包部署 我们的前端工程开发好了&#xff0c;但是我们需要发布&#xff0c;那么如何发布呢&#xff1f;主要分为2步&#xff1a; 前端工程打包 通过nginx服务器发布前端工程 6.1 前端工程打包 接下来我们先来对前端工程进行打包 我们直接通过VS Code的NPM脚本中提供的…

Linux gtest单元测试

1 安装git sudo apt-get install git2 下载googletest git clone https://github.com/google/googletest.git3 安装googletest 注意1: 如果在 make 过程中报错,可在 CMakeLists.txt 中增加如下行,再执行下面的命令: SET(CMAKE_CXX_FLAGS “-std=c++11”) 注意2: CMakeLists…

AI助力智慧农业,基于YOLOv5全系列模型【n/s/m/l/x】开发构建不同参数量级农田场景下庄稼作物、杂草智能检测识别系统

紧接前文&#xff0c;本文是农田场景下庄稼作物、杂草检测识别的第二篇文章&#xff0c;前文是基于YOLOv3这一网络模型实现的目标检测&#xff0c;v3相对来说比较早期的网络模型了&#xff0c;本文是基于最为经典的YOLOv5来开发不同参数量级的检测端模型。 首先看下实例效果&a…

【QT】Qt常用数值输入和显示控件

目录 1.QAbstractslider 1.1主要属性 2.QSlider 2.1专有属性 2.2 常用函数 3.QScrollBar 4.QProgressBar 5.QDial 6.QLCDNumber 7.上述控件应用示例 1.QAbstractslider 1.1主要属性 QSlider、QScrollBar和Qdial3个组件都从QAbstractSlider继承而来&#xff0c;有一些共有的属性…

精准定位安全续航 无人机解决方案打造交通巡逻新模式

现代城市交通管理是城市现代化的重要组成部分&#xff0c;但传统的交通管理系统存在一系列复杂繁琐的问题&#xff0c;同时&#xff0c;交警执勤也存在较大的安全隐患。为应对这一挑战&#xff0c;复亚智能深入研究无人机技术及应用&#xff0c;推出了一套全面的无人机解决方案…