Kimi LeetCode 3534. 针对图的路径存在性查询 II JavaScript实现

📅 2026/7/11 11:00:25
Kimi    LeetCode 3534. 针对图的路径存在性查询 II JavaScript实现
以下是 LeetCode 3534. 针对图的路径存在性查询 II 的完整 JavaScript 实现。---核心思路与之前各语言版本一致1. 排序按 nums 值排序建立原始下标到排序后位置的映射。2. 双指针求最远跳nxt[i] 表示从排序后位置 i 一步能到达的最远位置。3. 倍增预处理jump[i][k] 表示从 i 连续做 2^k 次最远跳到达的位置。4. 查询贪心同一连通分量内从高位到低位尝试跳跃求最少步数。时间复杂度O(n log n q log n)空间复杂度O(n log n)。---JavaScript 代码javascript/*** param {number} n* param {number[]} nums* param {number} maxDiff* param {number[][]} queries* return {number[]}*/var pathExistenceQueries function(n, nums, maxDiff, queries) {// 1. 按 nums 值排序记录原始下标 - 排序后位置的映射const order Array.from({length: n}, (_, i) i);order.sort((a, b) nums[a] - nums[b]);const sortedNums new Array(n);const pos new Array(n); // pos[originalIndex] sortedPositionfor (let i 0; i n; i) {sortedNums[i] nums[order[i]];pos[order[i]] i;}// 2. 计算连通分量编号排序后连续段const comp new Array(n);comp[0] 0;for (let i 1; i n; i) {comp[i] comp[i - 1];if (sortedNums[i] - sortedNums[i - 1] maxDiff) {comp[i];}}// 3. 双指针求 nxt[i]从排序后位置 i 一步能跳到的最远位置const nxt new Array(n);let r 0;for (let i 0; i n; i) {while (r 1 n sortedNums[r 1] - sortedNums[i] maxDiff) {r;}nxt[i] r;}// 4. 倍增数组jump[i][k] 表示从 i 连续跳 2^k 次最远跳到达的位置const LOG Math.ceil(Math.log2(n 1)) 1;const jump Array.from({length: n}, () new Array(LOG).fill(0));for (let i 0; i n; i) {jump[i][0] nxt[i];}for (let k 1; k LOG; k) {for (let i 0; i n; i) {jump[i][k] jump[jump[i][k - 1]][k - 1];}}// 5. 回答查询const ans new Array(queries.length);for (let i 0; i queries.length; i) {let u queries[i][0];let v queries[i][1];if (u v) {ans[i] 0;continue;}let pu pos[u];let pv pos[v];if (pu pv) {[pu, pv] [pv, pu];}// 不在同一连通分量不可达if (comp[pu] ! comp[pv]) {ans[i] -1;continue;}// 倍增贪心从高位到低位能跳就跳求最少步数let cur pu;let steps 0;for (let k LOG - 1; k 0; k--) {if (jump[cur][k] pv) {steps 1 k;cur jump[cur][k];}}// 最后一步一定能到达 pvans[i] steps 1;}return ans;};---关键点说明步骤 说明排序映射 pos[u] 将原始节点编号映射到排序后的位置。JavaScript 中用 Array.from 生成索引数组后排序。连通分量 排序后若相邻元素差 maxDiff则开启新连通分量。查询时先判断 comp[pu] comp[pv]。最远跳 nxt 双指针在 O(n) 内求出每个位置一步能覆盖的最远范围。nxt[i] 单调不降。倍增 jump jump[i][k] 表示从 i 出发连续做 2^k 次贪心最远跳到达的位置。LOG 取 Math.ceil(Math.log2(n 1)) 1 确保足够。查询贪心 从 pu 到 pv从高位到低位尝试如果跳 2^k 步后仍到不了 pv就先跳这 2^k 步。最终剩余距离只需一步即可覆盖。