# 3532. Path Existence Queries in a Graph I [3532. Path Existence Queries in a Graph I](https://leetcode.com/problems/path-existence-queries-in-a-graph-i/) (<font color="#FFB800"> Medium</font> 通過率: 54.4%) ## 限制條件 <ul> <li>1 <= n == nums.length <= 10^5</li> <li>0 <= nums[i] <= 10^5</li> <li>nums is sorted in non-decreasing order.</li> <li>0 <= maxDiff <= 10^5</li> <li>1 <= queries.length <= 10^5</li> <li>queries[i] == [ui, vi]</li> <li>0 <= ui, vi < n</li> </ul> ### 解法 1 主要是去看中間有沒有超過限制(maxDiff)的線段,有的話就將那一個 query 回傳 false 那這個方法是最差的暴力解,但我會先寫一個暴力解,再往上去寫比較快的(因為我不熟),這樣可以提高自己的理解力,也可以做為對照看有沒有寫錯。 - 時間複雜度: O(n*m) - 空間複雜度: O(n) ```cpp!= class Solution { public: vector<bool> pathExistenceQueries(int n, vector<int>& nums, int maxDiff, vector<vector<int>>& queries) { vector<bool> results(queries.size(), true); for (int i = 0; i < queries.size(); i++) { if (queries[i][0] == queries[i][1]) continue; if (queries[i][0] > queries[i][1]) swap(queries[i][0], queries[i][1]); for (int j = queries[i][0]; j < queries[i][1]; j++) { int fNum = nums[j]; int bNum = nums[j + 1]; cout << (bNum - fNum) << endl; if (abs(bNum - fNum) > maxDiff) { results[i] = false; break; } } } return results; } }; ``` ### 解法 2 第二種算是預先把所有線段看過,因為在每一個 query 當中,只要遇到一個超過 Diff 的就要回傳 false ,因此我將每個相鄰線段都先判斷,並用 record 儲存狀態,再讓 query 用"相減" 的方式可以讓每一個 query 都是 O(1) 就可以解決問題 - 時間複雜度: O(M+N) - 空間複雜度: O(M+N) ```cpp!= class Solution { public: vector<bool> pathExistenceQueries(int n, vector<int>& nums, int maxDiff, vector<vector<int>>& queries) { vector<bool> results(queries.size(), true); vector<int> record(nums.size(), 0); for (int i = 1; i < n; i++) { int fNum = nums[i - 1]; int bNum = nums[i]; int r = (bNum - fNum) > maxDiff; record[i] = record[i - 1] + r; } for (int i = 0; i < queries.size(); i++) { int fIdx = queries[i][0]; int bIdx = queries[i][1]; int result = (record[bIdx] - record[fIdx]); results[i] = !result; } return results; } }; ```