1. 程式人生 > 其它 >leetcode 路徑總和III 中等

leetcode 路徑總和III 中等

問題可以替換為,一個數組,求其有多少個子陣列和為 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, int
targetSum) { 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; } };