力扣题解(新增道路查询后的最短距离II)

3244. 新增道路查询后的最短距离 II

给你一个整数 n 和一个二维整数数组 queries

n 个城市,编号从 0n - 1。初始时,每个城市 i 都有一条单向 道路通往城市 i + 10 <= i < n - 1)。

queries[i] = [ui, vi] 表示新建一条从城市 ui 到城市 vi单向 道路。每次查询后,你需要找到从城市 0 到城市 n - 1最短路径长度

所有查询中不会存在两个查询都满足 queries[i][0] < queries[j][0] < queries[i][1] < queries[j][1]

返回一个数组 answer,对于范围 [0, queries.length - 1] 中的每个 ianswer[i] 是处理完 i + 1 个查询后,从城市 0 到城市 n - 1 的最短路径的长度

思路:

开始考虑的是二分搜索,因为觉得既然有l到r的边,那么就不用考虑l到(l+1,,,,r-1)之间的

边了,但是这里会发现无法判定当没有从l到(l+r)/2的边时候该怎么走,因为虽然题目要求不能有相交的边,但是可以有从一个边为左端点,然后右端点不同的情况。最终发现利用二分无法很好的解决这个问题。

本题考虑的是并查集的思路,将关注的重点放在边上,起初的时候每个节点i,f[i]+1表示其所能指向的最远的边,然后考虑的是从0到n-1一共有多少条边就行,每当遇到一个从l到r的边,就把从l+1开始到r-2的点都合并到r上,(r-1因为本来就有到r的边所以不用合并),每次合并都使得边的数目减少一,所以只需要记录一下边减少的数目,在和边原本的数目相减就是加上一条边以后最短距离了。

复制代码
class Solution {
public: 
       
     vector<int>f;
    vector<int> shortestDistanceAfterQueries(int n, vector<vector<int>>& queries) {
       f.resize(n);
        for(int i=0;i<n;i++)
        f[i]=i;

        vector<int>ans;
        int cnt=n-1;
        for(auto e:queries)
        {
            int x=e[0],y=e[1]-1;
            int r=find(y);
            for(int i=find(x);i<y;i=find(i+1))
            {
                f[i]=r;
                cnt--;
            }
            ans.push_back(cnt);
        }
        return ans;
    }
    int find(int x)
    {
        if(x!=f[x])f[x]=find(f[x]);
        return f[x];
    }
};
相关推荐
思考的笛卡尔1 小时前
密码学基础:RSA与AES算法的实现与对比
网络·算法·密码学
格林威7 小时前
常规线扫描镜头有哪些类型?能做什么?
人工智能·深度学习·数码相机·算法·计算机视觉·视觉检测·工业镜头
程序员莫小特9 小时前
老题新解|大整数加法
数据结构·c++·算法
过往入尘土10 小时前
服务端与客户端的简单链接
人工智能·python·算法·pycharm·大模型
zycoder.10 小时前
力扣面试经典150题day1第一题(lc88),第二题(lc27)
算法·leetcode·面试
蒙奇D索大10 小时前
【数据结构】考研数据结构核心考点:二叉排序树(BST)全方位详解与代码实现
数据结构·笔记·学习·考研·算法·改行学it
智驱力人工智能11 小时前
工厂抽烟检测系统 智能化安全管控新方案 加油站吸烟检测技术 吸烟行为智能监测
人工智能·算法·安全·边缘计算·抽烟检测算法·工厂抽烟检测系统·吸烟监测
程序员爱钓鱼11 小时前
Go语言实战案例——进阶与部署篇:编写Makefile自动构建Go项目
后端·算法·go
_Power_Y12 小时前
Java面试常用算法api速刷
java·算法·面试
艾醒(AiXing-w)12 小时前
大模型面试题剖析:模型微调中冷启动与热启动的概念、阶段与实例解析
人工智能·深度学习·算法·语言模型·自然语言处理