leetcode 路徑總和III 中等
阿新 • • 發佈:2021-08-20
問題可以替換為,一個數組,求其有多少個子陣列和為 target,兩者方法是一樣的。
對於陣列,可以 hash 儲存字首和,若當前字首和是 preSum,那麼到此 index 為止,ans += sum[preSum - target],這是很顯然的。
對樹上的,有一個樹上字首和,sum[i] 表示 i 到根節點的和,對於任意一條鏈 u, v,其和為 sum[u] + sum[v] - sum[lca(u, v)] - sum[father_lca(u, v)]
而題目要求的路徑是向下的,就簡單了。和陣列一樣的方式計算就行。
class Solution { public: int pathSum(TreeNode* root, inttargetSum) { sum[0] = 1; // 這一句話容易忽略 return solve(root, targetSum, 0); } private: unordered_map<int, int> sum; int solve(TreeNode *root, const int &targetSum, int preSum) { if(root == nullptr) return 0; int ret = 0; preSum += root -> val;if(sum.find(preSum - targetSum) != sum.end()) ret += sum[preSum - targetSum]; ++ sum[preSum]; ret += solve(root -> left, targetSum, preSum); ret += solve(root -> right, targetSum, preSum); -- sum[preSum]; return ret; } };