Leetcode3243. 新增道路查询后的最短距离 I

news2024/9/20 22:43:31

Every day a Leetcode

题目来源:3243. 新增道路查询后的最短距离 I

解法1:广度优先搜索

暴力。

每次加边后重新跑一遍 BFS,求出从 0 到 n−1 的最短路。

代码:

/*
 * @lc app=leetcode.cn id=3243 lang=cpp
 *
 * [3243] 新增道路查询后的最短距离 I
 */

// @lc code=start

// 广度优先搜索

class Solution
{
public:
    vector<int> shortestDistanceAfterQueries(int n, vector<vector<int>> &queries)
    {
        vector<int> e[n];
        // 建图
        for (int i = 1; i < n; i++)
            e[i - 1].push_back(i);

        auto bfs = [&]()
        {
            int dis[n];
            memset(dis, -1, sizeof(dis));
            queue<int> q;
            q.push(0);
            dis[0] = 0;
            while (!q.empty())
            {
                int sn = q.front();
                q.pop();
                for (int fn : e[sn])
                    if (dis[fn] == -1)
                    {
                        q.push(fn);
                        dis[fn] = dis[sn] + 1;
                    }
            }
            return dis[n - 1];
        };

        vector<int> ans;
        for (vector<int> &q : queries)
        {
            e[q[0]].push_back(q[1]);
            int res = bfs();
            ans.push_back(res);
        }
        return ans;
    }
};
// @lc code=end

结果:

在这里插入图片描述

复杂度分析:

时间复杂度:O(q(n+q)),其中 q 是数组 queries 的长度。每次 BFS 的时间是 O(n+q)。

空间复杂度:O(n+q),其中 q 是数组 queries 的长度。

解法2:动态规划

定义 dp[i] 为从 0 到 i 的最短路。

用 from[i] 记录额外添加的边的终点是 i,起点列表是 from[i]。

我们可以从 i−1 到 i,也可以从 from[i][j] 到 i,这些位置作为转移来源,用其 dp 值 +1 更新 dp[i] 的最小值。

初始值:dp[i]=i。

答案:dp[n−1]。

注意:设添加的边为 l→r,只有当 dp[l]+1<dp[r] 时才更新 DP。

代码:

/*
 * @lc app=leetcode.cn id=3243 lang=cpp
 *
 * [3243] 新增道路查询后的最短距离 I
 */

// @lc code=start

// 动态规划

class Solution
{
public:
    vector<int> shortestDistanceAfterQueries(int n, vector<vector<int>> &queries)
    {
        vector<int> dp(n);
        vector<vector<int>> from(n);
        // 初始化:dp[i] = i
        iota(dp.begin(), dp.end(), 0);

        vector<int> ans;
        // 状态转移
        for (vector<int> &q : queries)
        {
            int l = q[0], r = q[1];
            from[r].push_back(l);
            if (dp[l] + 1 < dp[r])
            {
                dp[r] = dp[l] + 1;
                // 更新后面的最短路
                for (int i = r + 1; i < n; i++)
                {
                    dp[i] = min(dp[i], dp[i - 1] + 1);
                    for (int j : from[i])
                    {
                        // 存在一条 j->i 的路径
                        dp[i] = min(dp[i], dp[j] + 1);
                    }
                }
            }
            ans.push_back(dp[n-1]);
        }
        return ans;
    }
};
// @lc code=end

结果:

在这里插入图片描述

复杂度分析:

时间复杂度:O(q(n+q)),其中 q 是数组 queries 的长度。

空间复杂度:O(n+q),其中 q 是数组 queries 的长度。

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

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

相关文章

一款免费开源功能强大的截图工具

Ksnip是一款功能强大的跨平台开源截图工具&#xff0c;基于Qt开发&#xff0c;支持Linux、Windows和macOS操作系统。Ksnip的主要特点包括多种截图模式和丰富的标注功能。 核心功能 截图模式&#xff1a;自定义矩形区域截图全屏截图当前显示器截图活动窗口截图鼠标下的窗口截图…

Eureka原理大起底:从菜鸟到高手,轻松玩转服务注册与发现的艺术!Eureka不只是个名字,它是微服务世界的‘万能钥匙’,解锁无限可能!

第一章 引言 Eureka原理&#xff0c;作为服务发现领域的一个重要理论&#xff0c;对于构建高可用的分布式系统具有指导意义。随着微服务架构的兴起&#xff0c;服务之间的发现和通信变得尤为关键&#xff0c;Eureka原理为解决这一问题提供了有效的方案。本文旨在深入探讨Eurek…

【精选】基于Hadoop的用户网站浏览分析的设计与实现(全网最新定制,独一无二)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

联盟 | ITNIO TECH颂量 X PartnerShare,助力跨境企业高效出海

*本文章转载自ITNIO TECH颂量 在全球化浪潮中&#xff0c;高效是出海企业在全球市场竞争中获胜的重要秘诀之一。因此&#xff0c;跨境企业除了需要单一的技术或服务&#xff0c;还需要能够整合多种资源、提供一站式解决方案的合作伙伴。ITNIO TECH颂量宣布与SaaS推广分销联盟系…

前端面试题-手撕代码题

1. 实现 Promise.all&#xff0c;或者 实现 Promise.allSettled &#xff08;1&#xff09;promise.all: 传入一个promise数组&#xff0c;其中所有promise都变为成功状态&#xff0c;返回一个数组&#xff0c;数组内是各个promise的返回&#xff1b;若任意传入的promise变为…

16:螺丝孔和MARK点布局

正版mark布局 ①正面3个。背面3个 ②离板边5mm 螺丝孔 板边

Mako 试玩|编译速度6到飞起!

嗨&#xff01;我是小谷&#xff0c;大家好久不见&#xff5e; 今天想和大家分享的技术是 Mako , 一款编译构建速度比 webpack 快 10 倍&#xff5e;100 倍的前端构建工具。 网上有传言将 Mako 比作前端脚手架里的 鲨鱼心脏 &#xff0c;有了它&#xff0c;前端工程师工作的幸…

重塑未来:碳捕集与存储(CCS)的革命性突破与可持续发展路径

随着全球气候变化的加剧&#xff0c;减少二氧化碳&#xff08;CO₂&#xff09;排放已成为应对气候变化的关键任务之一。碳捕集与存储&#xff08;CCS&#xff09;技术因其能够直接从源头捕捉CO₂并将其安全存储&#xff0c;避免其进入大气层&#xff0c;而受到广泛关注。CCS被…

QT做一个USB HID设备识别软件

1.下载 HidApi库&#xff1a;GitHub - yigityuce/HidApi: Human Interface Device Api (HidApi) with C 2.pro文件添加 DEFINES - UNICODE LIBS -lsetupapi 3.建立三个对象 HidApi hidApi;HidDevice hidDev;//HID设备HidDeviceList devList;//HID设备列表 4.对 HID 设备进…

大连网站建设手机网页页面设计

在现代社会&#xff0c;随着智能手机的普及&#xff0c;越来越多的用户选择通过手机访问网站&#xff0c;这使得移动端网页设计的重要性日益凸显。大连作为一个经济和文化中心&#xff0c;网站建设行业也在不断发展。针对大连的网站建设&#xff0c;手机网页页面设计需要特别注…

在街子古镇游的台湾自媒体人

刚刚看到《网易首页 > 网易号》于昨&#xff08;8月31日逾23时&#xff09;天深夜发布《崇州看点》的新闻报道《台湾自媒体人天府游记&#xff0c;被崇州的这个地方深深吸引……》&#xff0c;虽觉得新鲜但并不感到惊奇。因为在去年12月5日&#xff0c;《人民日报海外版》和…

CAS单点登录说明文档

CAS单点登录说明文档 目录 1. 下载CAS 2. 下载xmlsectool 3. 安装xmlsectool 4. 打包CAS 5. 连接服务器 6. 安装Tomcat服务器 7. 创建CAS程序 8. 修改CAS界面 9. 修改CAS服务端口 10. 修改CAS服务名称 11. 修改CAS日志路径 12. 创建数据库 13. 启动CA…

PD快充协议

表格中电压电流档位的电流都是在该电压下输出的最大电流。在充电的过程当中&#xff0c;充电器输出的电流会根据充电设备的需求进行动态调整&#xff0c;不是说握手了20V 5A档位充电器输出的电流就一直都是5A。 这个屏幕显示了几种常见的快充协议及其支持的电压、电流和功率。这…

kubeadm部署 Kubernetes(k8s) 高可用集群【V1.28 】

kubeadm是官方社区推出的一个用于快速部署kubernetes集群的工具。 calico.yaml kubernertes-dashboard.yaml 1. 安装要求 在开始之前&#xff0c;部署Kubernetes集群机器需要满足以下几个条件&#xff1a; 10台机器&#xff0c;操作系统Openeuler22.03 LTS SP4硬件配置&…

2024年【制冷与空调设备运行操作】找解析及制冷与空调设备运行操作实操考试视频

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 制冷与空调设备运行操作找解析参考答案及制冷与空调设备运行操作考试试题解析是安全生产模拟考试一点通题库老师及制冷与空调设备运行操作操作证已考过的学员汇总&#xff0c;相对有效帮助制冷与空调设备运行操作实操…

【大模型】Agent基础知识

目录 1. 基本框架2. 常见推理模式2.1 ReAct: Synergizing Reasoning and Acting in Language Models2.2 Reflection2.3 LATS: Language Agents Tree Search 3. 微调3.1 全模型微调&#xff08;Full Model Fine-Tuning&#xff09;3.2 冻结部分层微调&#xff08;Layer-wise Fin…

IPC核间通信底层原理:以PL320为例

什么是IPC核间通信 讲到IPC可能很多同学想到的是InterProcess Communication进程间通信&#xff0c;但是本文主要是讲另一种Inter-processor communication,处理器间通信&#xff0c;也叫核间通信&#xff0c;名字很像不要搞混。 为什么需要核间通信 现在的芯片系统非常复杂…

企业微信dll,最新版dll

1.基础信息获取,如登录用户信息、联系人列表、群组列表等。 2.联系人操作,如修改备注、添加删除联系人等。 3.群操作,如创建群聊、邀请添加成员、修改群信息等。 4.消息发送,支持文本、图片、文件、位置等不同类型消息的发送。 5.支持通过DLL调用实现自动化功能,如机器人自动回…

Python一些可能用的到的函数系列131 发送钉钉机器人消息

说明 来自顾同学的助攻 钉钉机器人可以用来发送一些重要的系统消息&#xff0c;例如磁盘将满等等。原本还可以有更强的功能&#xff0c;就是监听群里的消息&#xff0c;然后做出反应&#xff0c;不过这个好像要买企业版&#xff0c;贵的毫无意义。 钉钉发消息有几种模式&#…

python中pip源配置

文章目录 1、前言2、pip下载源配置 1、前言 conda环境的源配置&#xff0c;相关博客有很多&#xff0c;这里不再赘述。在我使用梯子后&#xff0c;使用pip进行库安装&#xff0c;总是出现错误情况&#xff0c;如下所示&#xff1a; 2、pip下载源配置 因此&#xff0c;在这里进…