从lc560“和为 K 的子数组“带你认识“前缀和+哈希表“的解题思路

1 前缀和+哈希表解题的几道题目:建议集中练习

java 复制代码
 560. 和为 K 的子数组:https://leetcode.cn/problems/subarray-sum-equals-k/
1248. 统计「优美子数组」: https://leetcode.cn/problems/count-number-of-nice-subarrays/
1249. 和可被 K 整除的子数组(利用同余定理):https://leetcode.cn/problems/subarray-sums-divisible-by-k/
1250. 连续的子数组和:https://leetcode.cn/problems/continuous-subarray-sum/

2 在树中利用"前缀和+哈希表"的解题思路 - "437. 路径总和 III" ?

LeetCode上有一道题目和"560. 和为 K 的子数组"在解法上非常类似,那就是"437. 路径总和 III"。这道题目是关于二叉树的,要求找到二叉树中和为K的路径的数量。其解法也是利用前缀和和哈希表。

2.1 疑惑

下面两个回溯代码有啥区别?

java 复制代码
    void dfs(TreeNode root, int t, Long sum){
        if(root==null)return;
        Long ns=sum+root.val;
        if(mp.containsKey(ns-t)){
            res+=mp.get(ns-t);
        }
        mp.put(ns,mp.getOrDefault(ns,0)+1);
        dfs(root.left,t,ns);
        // mp.put(ns,mp.get(ns)-1);
        dfs(root.right,t,ns);
        mp.put(ns,mp.get(ns)-1);
    }
java 复制代码
    void dfs(TreeNode root, int t, Long sum){
        if(root==null)return;
        Long ns=sum+root.val;
        if(mp.containsKey(ns-t)){
            res+=mp.get(ns-t);
        }
        mp.put(ns,mp.getOrDefault(ns,0)+1);
        dfs(root.left,t,ns);
        mp.put(ns,mp.get(ns)-1);
        dfs(root.right,t,ns);
        mp.put(ns,mp.get(ns)-1);
    }
相关推荐
Albert Edison34 分钟前
【项目设计】C++ 高并发内存池
数据结构·c++·单例模式·哈希算法·高并发
小许学java3 小时前
数据结构-模拟实现顺序表和链表
java·数据结构·链表·arraylist·linkedlist·顺序表模拟实现·链表的模拟实现
稚辉君.MCA_P8_Java4 小时前
Gemini永久会员 C++返回最长有效子串长度
开发语言·数据结构·c++·后端·算法
dragoooon345 小时前
[优选算法专题十.哈希表 ——NO.55~57 两数之和、判定是否互为字符重排、存在重复元素]
数据结构·散列表
稚辉君.MCA_P8_Java6 小时前
Gemini永久会员 go数组中最大异或值
数据结构·后端·算法·golang·哈希算法
会员果汁7 小时前
双向链式队列-C语言
c语言·数据结构
AI科技星7 小时前
张祥前统一场论:引力场与磁矢势的关联,反引力场生成及拉格朗日点解析(网友问题解答)
开发语言·数据结构·经验分享·线性代数·算法
C雨后彩虹7 小时前
最少交换次数
java·数据结构·算法·华为·面试
-森屿安年-8 小时前
二叉平衡树的实现
开发语言·数据结构·c++
稚辉君.MCA_P8_Java8 小时前
Gemini永久会员 Go 返回最长有效子串长度
数据结构·后端·算法·golang