leetcode 3532. 针对图的路径存在性查询 I 中等

给你一个整数 n,表示图中的节点数量,这些节点按从 0 到 n - 1 编号。

同时给你一个长度为 n 的整数数组 nums,该数组按 非递减 顺序排序,以及一个整数 maxDiff。

如果满足 |nums[i] - nums[j]| <= maxDiff(即 nums[i] 和 nums[j] 的 绝对差 至多为 maxDiff),则节点 i 和节点 j 之间存在一条 无向边。

此外,给你一个二维整数数组 queries。对于每个 queries[i] = [ui, vi],需要判断节点 ui 和 vi 之间是否存在路径。

返回一个布尔数组 answer,其中 answer[i] 等于 true 表示在第 i 个查询中节点 ui 和 vi 之间存在路径,否则为 false。

示例 1:

输入: n = 2, nums = 1,3, maxDiff = 1, queries = \[0,0,0,1]

输出: true,false

解释:

  • 查询 [0,0]:节点 0 有一条到自己的显然路径。
  • 查询 [0,1]:节点 0 和节点 1 之间没有边,因为 |nums[0] - nums[1]| = |1 - 3| = 2,大于 maxDiff。
  • 因此,在处理完所有查询后,最终答案为 [true, false]。

示例 2:

输入: n = 4, nums = 2,5,6,8, maxDiff = 2, queries = \[0,1,0,2,1,3,2,3]

输出: false,false,true,true

解释:

生成的图如下:

  • 查询 [0,1]:节点 0 和节点 1 之间没有边,因为 |nums[0] - nums[1]| = |2 - 5| = 3,大于 maxDiff。
  • 查询 [0,2]:节点 0 和节点 2 之间没有边,因为 |nums[0] - nums[2]| = |2 - 6| = 4,大于 maxDiff。
  • 查询 [1,3]:节点 1 和节点 3 之间存在路径通过节点 2,因为 |nums[1] - nums[2]| = |5 - 6| = 1 和 |nums[2] - nums[3]| = |6 - 8| = 2,都小于等于 maxDiff。
  • 查询 [2,3]:节点 2 和节点 3 之间有一条边,因为 |nums[2] - nums[3]| = |6 - 8| = 2,等于 maxDiff。
  • 因此,在处理完所有查询后,最终答案为 [false, false, true, true]。

提示:

  • 1 <= n == nums.length <= 10^5
  • 0 <= nums[i] <= 10^5
  • nums 按 非递减顺序排序。
  • 0 <= maxDiff <= 10^5
  • 1 <= queries.length <= 10^5
  • queries[i] == [ui, vi]
  • 0 <= ui, vi < n

分析:遍历 nums,计算每个节点所在连通块的编号,从 0 开始。

如果 numsi−numsi−1>maxDiff,那么 i 在一个新的连通块中,编号加一。否则编号不变。对于每个查询,只需要检查两个节点是否处于同一个连通块即可。

cpp 复制代码
class Solution {
public:
    vector<bool> pathExistenceQueries(int n, vector<int>& nums, int maxDiff, vector<vector<int>>& queries) {
        vector<int>pos(n);pos[0]=1;
        vector<bool>ans;
        for(int i=1;i<n;++i)
        {
            if(nums[i]-nums[i-1]<=maxDiff)pos[i]=pos[i-1];
            else pos[i]=pos[i-1]+1;
        }
        for(int i=0,m=queries.size();i<m;++i)
        {
            int l=queries[i][0],r=queries[i][1];
            if(pos[l]==pos[r])ans.push_back(true);
            else ans.push_back(false);
        }
        return ans;
    }
};
相关推荐
longlongzihan14 小时前
从LeetCode 70. 爬楼梯看动态规划:如何精准推导状态转移方程?
c++·算法·leetcode·动态规划
Rnan-prince19 小时前
LeetCode 股票买卖系列:一个动态规划状态机模板通吃四题
leetcode·动态规划
圣保罗的大教堂19 小时前
leetcode 3756. 连接非零数字并乘以其数字和 II 中等
leetcode
All for pursuit.1 天前
【回溯-7】494.目标和
数据结构·c++·算法·leetcode
Tisfy1 天前
LeetCode 0678.有效的括号字符串:O(n)+O(1)一次遍历
算法·leetcode·字符串·题解·贪心·括号匹配
Navigator_Z2 天前
LeetCode //C - 1278. Palindrome Partitioning III
c语言·算法·leetcode
青山木2 天前
Hot 100 --- 编辑距离
java·数据结构·算法·leetcode·动态规划
All for pursuit.2 天前
【回溯-4】46.全排列
数据结构·c++·算法·leetcode
All for pursuit.2 天前
【回溯-5】78.子集
数据结构·c++·算法·leetcode