Leetcode3244:新增道路查询后的最短距离 II(C++)

题目描述:

给你一个整数 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 的最短路径的长度

代码思路:

  1. 初始化位置 :首先,我们有一个长度为 n 的数组 d,表示初始位置,其中每个位置 i 存放的是 i

  2. 处理每个查询

    • 对于每个查询 queries[i],我们需要找到初始位置 queries[i][0] 和目标位置 queries[i][1] 在当前数组 d 中的位置。
    • 将初始位置到目标位置之间的所有元素(包括初始位置但不包括目标位置,如果它们不相同)从数组 d 中移除,模拟点的移动和位置的重新编号。
    • 计算新的位置 0 到被移动点的最短距离。由于移动后位置重新编号,被移动的点将位于新的数组 d 的中间位置(或者偏左或偏右,取决于移动的方向和距离),因此最短距离将是数组 d 长度的一半(取整),除非被移动的点正好在位置 0(此时距离为 0)。
  3. 返回结果 :将所有查询后的最短距离存储在数组 ans 中,并返回该数组。

    cpp 复制代码
    class Solution {
    public:
        vector<int> shortestDistanceAfterQueries(int n, vector<vector<int>>& queries) {
            vector<int> d(n), ans(queries.size());
            iota(d.begin(), d.end(), 0);
    
            for (int i = 0; i < queries.size(); i++) {
                auto l = upper_bound(d.begin(), d.end(), queries[i][0]);
                auto r = lower_bound(d.begin(), d.end(), queries[i][1]);
                if (l <= r) d.erase(l, r);
                
                ans[i] = d.size() - 1;
            }
            return ans;
        }
    };
相关推荐
感哥43 分钟前
C++ 模板
c++
掘金安东尼1 小时前
Amazon Lambda + API Gateway 实战,无服务器架构入门
算法·架构
码流之上2 小时前
【一看就会一写就废 指间算法】设计电子表格 —— 哈希表、字符串处理
javascript·算法
快手技术4 小时前
快手提出端到端生成式搜索框架 OneSearch,让搜索“一步到位”!
算法
感哥5 小时前
C++ 多重继承
c++
博笙困了5 小时前
C++提高编程 4.0
c++
扑克中的黑桃A5 小时前
[C语言]第三章-数据类型&变量
c++
感哥6 小时前
C++ std::string
c++
感哥1 天前
C++ 面向对象
c++
CoovallyAIHub1 天前
中科大DSAI Lab团队多篇论文入选ICCV 2025,推动三维视觉与泛化感知技术突破
深度学习·算法·计算机视觉