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;
        }
    };
相关推荐
带多刺的玫瑰1 小时前
Leecode#4刷题之寻找两个正序数组的中位数
java·前端·算法
土司大王1 小时前
LeetCode hot100——除了自身以外数组的乘积
数据结构·算法·leetcode
IvanCodes1 小时前
RAG 实战教程(三):向量数据库检索算法,KNN、IVF、HNSW 与 Faiss 实战
人工智能·算法·agent
阿无,2 小时前
布隆过滤器
java·算法·哈希算法
徒慕风流2 小时前
激光雷达回波信号滤波与时刻鉴别算法:原理、代码实现与仿真验证
python·算法·激光雷达
这料鬼有毒2 小时前
二刷hot100-70.爬楼梯
算法
CIO_Alliance2 小时前
AI算法系列(2)| 决策树与随机森林XGBoost:企业AI化转型中的树模型选型逻辑
大数据·人工智能·算法·决策树·系统集成·企业cio联盟·企业级ai化转型
ZC跨境爬虫3 小时前
LeetCode 13. 罗马数字转整数(多解法详解 + Java Python 实现)
java·python·leetcode
.道阻且长.3 小时前
10.LeetCode算法习题讲解--滑动窗口--最大连续为一的个数
算法·leetcode·职场和发展
学习中.........4 小时前
Karpathy nanoGPT 教程到底讲了什么
人工智能·算法·语言模型