https://leetcode.com/problems/longest-special-path/description/
class Solution {
public:
int ansValue, ansLen;
void dfs(int pre, int cur, int curDep, vector<vector<pair<int, int>>> &g, vector<int> &nums, vector<int> &arr, int l, unordered_map<int, int> &dep) {
int prevDep = 0;
if (dep.count(nums[cur])) prevDep = dep[nums[cur]];
dep[nums[cur]] = curDep;
l = max(l, prevDep);
int curValue = arr.back() - arr[l];
int curLen = curDep - l;
if (ansValue < curValue || (ansValue == curValue && curLen < ansLen)) {
ansValue = curValue;
ansLen = curLen;
}
for (auto [nxt, val]: g[cur]) {
if (nxt == pre) continue;
arr.push_back(arr.back() + val);
dfs(cur, nxt, curDep + 1, g, nums, arr, l, dep);
arr.pop_back();
}
dep[nums[cur]] = prevDep;
}
vector<int> longestSpecialPath(vector<vector<int>>& edges, vector<int>& nums) {
ansValue = 0, ansLen = 1;
int n = nums.size();
vector<vector<pair<int, int>>> g(n);
for (auto &x: edges) {
g[x[0]].push_back({x[1], x[2]});
g[x[1]].push_back({x[0], x[2]});
}
vector<int> arr;
unordered_map<int, int> cnt;
arr.push_back(0);
cnt[nums[0]] = 0;
dfs(-1, 0, 1, g, nums, arr, 0, cnt);
return {ansValue, ansLen};
}
};
Tag: Tree, DFS, Sliding Window
本題的考點在樹上做 Sliding Window,透過題目可以知道他挺符合 Sliding Window 的樣子,也就是在一個 Window 當中不可以存在相同的數字。
這裡還有一個難點是在需要使用 prefix sum 來知道一個區間內的總合,同時需要紀錄一個 left 值來與當前往前跳的進行比較,才會知道到底最前面是到哪裡。