【LeetCode:2477. 到达首都的最少油耗 | DFS + 贪心】

news/2024/7/20 21:29:32 标签: leetcode, 深度优先, 算法, java, 贪心, 二叉树,

在这里插入<a class=图片描述" />

🚀 算法题 🚀

🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀
🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨
🌲 作者简介:硕风和炜,CSDN-Java领域新星创作者🏆,保研|国家奖学金|高中学习JAVA|大学完善JAVA开发技术栈|面试刷题|面经八股文|经验分享|好用的网站工具分享💎💎💎
🌲 恭喜你发现一枚宝藏博主,赶快收入囊中吧🌻
🌲 人生如棋,我愿为卒,行动虽慢,可谁曾见我后退一步?🎯🎯

🚀 算法题 🚀

在这里插入<a class=图片描述" />

在这里插入<a class=图片描述" />

🍔 目录

    • 🚩 题目链接
    • ⛲ 题目描述
    • 🌟 求解思路&实现代码&运行结果
      • ⚡ DFS + 贪心
        • 🥦 求解思路
        • 🥦 实现代码
        • 🥦 运行结果
    • 💬 共勉

🚩 题目链接

  • 2477. 到达首都的最少油耗

⛲ 题目描述

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

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

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

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

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

示例 1:

在这里插入<a class=图片描述" />

输入:roads = [[0,1],[0,2],[0,3]], seats = 5
输出:3
解释:

  • 代表 1 直接到达首都,消耗 1 升汽油。
  • 代表 2 直接到达首都,消耗 1 升汽油。
  • 代表 3 直接到达首都,消耗 1 升汽油。
    最少消耗 3 升汽油。

示例 2:

在这里插入<a class=图片描述" />

输入: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:
在这里插入<a class=图片描述" />

输入: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

🌟 求解思路&实现代码&运行结果


⚡ DFS + 贪心

🥦 求解思路
  1. 我们可以分别考虑每个子树对于答案的最终贡献(也就是考虑子树所有节点通过某一条边、路,对于答案的贡献),每个子树怎么贡献呢?统计每个子树的节点个数cnt,然后(cnt/seats) 向上取整,得到当前子树的贡献(油耗数),继续dfs过程,最后累加所有的贡献。
  2. 具体实现的时候。首先,这道题目我们可以先建,创建各个节点的关系,然后从0位置开始,dfs遍历,找到所有子树对答案的贡献。
  3. 实现代码如下所示:
🥦 实现代码
java">class Solution {

    public long ans;

    public long minimumFuelCost(int[][] roads, int seats) {
        int n = roads.length + 1;
        List<Integer>[] g = new ArrayList[n];
        Arrays.setAll(g, e -> new ArrayList<>());
        for (int[] e : roads) {
            int x = e[0], y = e[1];
            g[x].add(y);
            g[y].add(x);
        }
        dfs(0, -1, g, seats);
        return ans;
    }

    public int dfs(int x, int father, List<Integer>[] g, int seats) {
        int size = 1;
        for (int next : g[x]) {
            if (next != father) {
                int cnt = dfs(next, x, g, seats);
                size += cnt;
                ans += (cnt + seats - 1) / seats;
            }
        }
        return size;
    }
}
🥦 运行结果

在这里插入<a class=图片描述" />


💬 共勉

最后,我想和大家分享一句一直激励我的座右铭,希望可以与大家共勉!

在这里插入<a class=图片描述" />

在这里插入<a class=图片描述" />


http://www.niftyadmin.cn/n/5242832.html

相关文章

备份和恢复Linux服务器上的HTTP配置

备份和恢复Linux服务器上的HTTP配置是一项重要的任务&#xff0c;它可以确保您的服务器在出现故障或配置错误时能够迅速恢复正常运行。下面我们将介绍如何备份和恢复Linux服务器上的HTTP配置。 备份HTTP配置 登录到Linux服务器上&#xff0c;并使用root权限。 备份HTTP配置文…

Tektronix泰克示波器

一、what’s the oscilloscope&#xff1f; 【ref】https://www.tek.com.cn/blog/what-is-an-oscilloscope 二、基础知识 1、带宽&#xff1a;100Mhz&#xff1b;采样率&#xff1a;2.5GS/s 1GS/s指的是采样率&#xff0c;前面大写的S是sample采样的意思 后面的s是秒 也就是示波…

Git篇常用命令

it是一款流行的版本控制系统&#xff0c;用于管理代码的版本和历史记录。以下是Git篇的一些常用命令&#xff1a; git init&#xff1a;初始化一个新的Git仓库。git clone <repository>&#xff1a;克隆一个已有的Git仓库到本地。git add <file> 或 git add .&…

docker镜像管理,仓库管理基本命令

镜像管理 搜索镜像 语法&#xff1a; docker search 镜像名 [-f stars100] [rootlocalhost ~]# docker search nginx NAME DESCRIPTION STARS OFFICIAL AUTOMATED nginx …

ArkUI组件--Text组件

1.声明Text组件并设置文本内容 Text(content?:string|Recource) #两种数据类型&#xff0c;字符串和本地资源文件 ①string格式&#xff0c;直接填写文本内容 Text(需要显示的文本) ②Recource格式&#xff0c;读取本地资源文件 Text($r(app.string.width_label)) 读取图…

java数字千分位格式转换

java数字千分位格式转换 public static void main(String[] args) {System.out.println(thousandsSeparator("123123131"));}public static String thousandsSeparator(String value) {if (isNotNull(value)) {String[] arr value.split("");for (int i …

python基于YOLOv7系列模型【yolov7-tiny/yolov7/yolov7x】开发构建钢铁产业产品智能自动化检测识别系统

在前文的项目开发实践中&#xff0c;我们已经以钢铁产业产品缺陷检测数据场景为基准&#xff0c;陆续开发构建了多款目标检测模型&#xff0c;感兴趣的话可以自行阅读即可。 《YOLOv3老矣尚能战否&#xff1f;基于YOLOv3开发构建建钢铁产业产品智能自动化检测识别系统&#xf…

查看端口占用并杀死进程

1.安装查看工具 sudo yum install net-tools 2.查看占用情况 netstat -tunlp | grep 8089 3.杀死进程 kill -9 227