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;
        }
    };
相关推荐
灵晔君23 分钟前
【C++】二叉搜索树
开发语言·c++
大鱼>26 分钟前
宠物异常行为预警系统:边缘计算与实时检测
人工智能·深度学习·算法·iot·宠物
鱼子星_1 小时前
【C++】内存管理:内存分布,new/delete的使用及细节处理,new/delete的底层,定位new表达式
开发语言·c++·笔记
鱼子星_1 小时前
【C++】string(上):string的基本使用
c++·笔记·字符串
米尔的可达鸭2 小时前
深入操作系统 Socket 底层:套接字控制块、FD映射、阻塞IO核心完整实现
arm开发·数据结构·websocket·网络协议·算法·架构·安全架构
tachibana22 小时前
hot100 课程表(207)
java·数据结构·算法·leetcode
神仙别闹2 小时前
编写基于C++ Huffman 算法的无损压缩程序和解压程序
java·c++·算法
炸膛坦客2 小时前
单片机/C/C++八股:(二十三)#define 和 typedef 的区别
c语言·c++·单片机
大鱼>2 小时前
宠物活动轨迹追踪系统:GPS/BDS+UWB+BLE多定位融合方案
人工智能·深度学习·算法·iot·宠物
闲研随记2 小时前
【文献阅读 ICML 2026】RL算法:R2VPO
论文阅读·人工智能·算法·强化学习·icml·rl算法