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 小时前
位姿转换矩阵写法-个人习惯(计算机理解其实是相反的)
线性代数·算法·矩阵
青梅味猪大肠2 小时前
【深入浅出C++】为什么虚表指针可以解决菱形继承
开发语言·c++
Lhan.zzZ2 小时前
QML 组件库:VS2022 + Qt 静态库方案
开发语言·c++·qt·visual studio
小白羊丨4 小时前
如何诊断 Prompt 模板导致的效果下降?
人工智能·算法·prompt
一木 之林5 小时前
五、C++ 新特性、关键字与编译原理(进阶)(二)
java·开发语言·c++
OPEN-F5 小时前
C++11/14新特性精讲:移动语义与智能指针实战
开发语言·c++·算法
闭月之泪舞5 小时前
C++编程学习
c++·学习
lisin-lee-cooper5 小时前
【leetcode658】有序数组找出k个最接近x的数
java·数据结构·算法
sunburn-5 小时前
Java堆(Heap)详解与实战教学
java·开发语言·数据结构·ide·算法
智碳能碳管理平台6 小时前
工业能耗台账标准化:能碳管理系统的数据口径怎么设计
算法·能碳管理系统·智碳能碳管理平台·企业能碳管理系统·碳排放核算软件·绿色工厂申报saas·能碳管理平台