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;
        }
    };
相关推荐
GISer_Jing13 分钟前
前端算法实战:大小堆原理与应用详解(React中优先队列实现|求前K个最大数/高频元素)
前端·算法·react.js
DBWYX1 小时前
c++项目 网络聊天服务器 实现;QPS测试
c++
小森77671 小时前
(三)机器学习---线性回归及其Python实现
人工智能·python·算法·机器学习·回归·线性回归
振鹏Dong2 小时前
超大规模数据场景(思路)——面试高频算法题目
算法·面试
uhakadotcom2 小时前
Python 与 ClickHouse Connect 集成:基础知识和实践
算法·面试·github
uhakadotcom2 小时前
Python 量化计算入门:基础库和实用案例
后端·算法·面试
uhakadotcom2 小时前
使用 Python 与 BigQuery 进行交互:基础知识与实践
算法·面试
uhakadotcom2 小时前
使用 Hadoop MapReduce 和 Bigtable 进行单词统计
算法·面试·github
XYY3693 小时前
前缀和 一维差分和二维差分 差分&差分矩阵
数据结构·c++·算法·前缀和·差分
longlong int3 小时前
【每日算法】Day 16-1:跳表(Skip List)——Redis有序集合的核心实现原理(C++手写实现)
数据库·c++·redis·算法·缓存