目录
前缀和与哈希表
LeetCode560 和为K的子数组
class Solution {
public:
int subarraySum(vector<int>& nums, int k) {
unordered_map<int,int> h; //<前缀和,数量>
int sum=0;//前缀和
int n=nums.size();
int res=0;
h[0]=1;//考虑子数组下标从0开始的情况
for(int i=0;i<n;i++){
sum+=nums[i];
// 注意不要直接 res+= h[sum-k],如果 sum-k 不存在,会插入 sum-k
if(h.find(sum-k)!=h.end()){
res+=h[sum-k];
}
h[sum]++;
}
return res;
}
};
时间复杂度:O(n)
空间复杂度:O(m),m为h中不同元素的数量
LeetCode437 路径总和III
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
int res=0;
unordered_map<long long,int> h;
long long sum=0;
void dfs(TreeNode* root,int target){
if(root==nullptr) return;
sum+=root->val;
if(h.find(sum-target)!=h.end()) res+=h[sum-target];
h[sum]++;
dfs(root->left,target);
dfs(root->right,target);
h[sum]--;//恢复现场
sum-=root->val;
}
int pathSum(TreeNode* root, int targetSum){
h[0]=1;
dfs(root,targetSum);
return res;
}
};
时间复杂度:O(n)
空间复杂度:O(n)