第七十三天 --- 力扣437(前缀和解法)

  • 题目一(前缀和解法)
    • 思路
    • 代码

题目一(前缀和解法)

力扣:437

思路

1、上一次我们用的暴力O(n^2)的解法(详见:暴力解437 ),根据题目,我们发现,任意一个节点都可能是路径的起点,所以为了找全,我们就需要遍历每一个节点,在此之上研究他的子树问题,这种就是每找一次,起点终点都是确定的,所以为了不缺答案,要先枚举所有起点,再找对应的终点,所以复杂度O(n^2)
2、但是太复杂了,做了很多额外劳动,所以再读题,他让我们找一个路径,这个路径的和得符合要求,所以经典路径(区间)和的问题,用前缀和解法。
3、节点a和节点b处前缀和已知(分别是prefix_a,prefix_b),如果从a到b的路径是答案,那么prefix_b-prefix_a=targetSum。
4、因为采用前缀和,所以开始遍历的时候,从上到下就是一个求取前缀和的过程,一旦一条路径走到了最下面,便开始向上回溯(回溯的值就是有多少个目标路径),每次回溯到一个节点,问左右儿子,他们统计到了多少,最后看以自己作为终点,有多少个对应的起点就有多少个答案路径,把三者做和即为这个节点能贡献的路径数。这里多说一下为啥这种算法快,因为当统计以自己为结束位置时,他想上只需要知道有多少个符合条件的前缀和,不需要知道哪些点的具体位置,只统计个数的话就很简单了,单独记录一下就行。

代码

注意:
1、一维前缀和,初始化的时候就是长度为0的时候!!!!!!!!
2、在开始继续向下统计的时候,当前节点前缀和算完了,要加入map里面,当左右儿子都完事了,当前节点利用价值没了,已经用过了,所以map里面对应项–即可。

class Solution {public:unordered_map<long long, int> item;//存储前缀和,key代表前缀和,value代表出现次数int treePrefixSum(TreeNode* root, int cur, int target) {if (root == nullptr) {return 0;}cur += root->val;//求前缀和int ans = 0;//答案//后根遍历回溯算法item[cur]++;//自己已经统计完了前缀和,要加入mapans += treePrefixSum(root->left, cur, target);//加入左右儿子统计结果ans += treePrefixSum(root->right, cur, target);item[cur]--;if (item.count(cur - target)) {//统计以当前节点为结束符的路径个数ans += item[cur - target];}return ans;//返回三者的和}int pathSum(TreeNode* root, int targetSum) {item[0] = 1;return treePrefixSum(root, 0, targetSum);}
};

(所有代码均已在力扣上运行无误)

经测试,该代码运行情况是(经过多次测试所得最短时间):

时间复杂度O(N)
空间复杂度O(N)

力扣437(前缀和解法)相关推荐

  1. 力扣的组合总和解法 (Python)

    力扣的组合总和解法 题目描述: 给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candidat ...

  2. 买卖股票的最佳时机——力扣121题

    买卖股票的最佳时机--力扣121题 暴力解法 从前往后,不断将元素之间进行两两比较(类似冒泡排序中),然后不断更新出maxProfit的值.例如数组[7,1,5,3,6,4]中,从7开始,则7 -&g ...

  3. 力扣编程题-解法汇总

    一.力扣链接: 题库 - 力扣 (LeetCode) 全球极客挚爱的技术成长平台 备注:以后每个工作日从前往后刷一道题,然后再加一道每日新题.每天两道题. 二.模版: 标题: 力扣解法汇总5-正则表达 ...

  4. LeetCode 第 59 场力扣夜喵双周赛(最短路径数+迪杰斯特拉、动态规划+最长公共前缀问题) / 第255场周赛(二进制转换,分组背包,子集还原数组(脑筋急转弯))

    第 59 场力扣夜喵双周赛 两道400多五百,后两道都写出代码来了,但是都有问题,哭辽- 还有刚开始第一道测试好慢,搞心态了 5834. 使用特殊打字机键入单词的最少时间 有一个特殊打字机,它由一个 ...

  5. ​力扣解法汇总954-二倍数对数组

    目录链接: 力扣编程题-解法汇总_分享+记录-CSDN博客 GitHub同步刷题项目: https://github.com/September26/java-algorithms 原题链接:力扣 描 ...

  6. 力扣牛客每日刷题(Python解法持续更新)

    力扣牛客每日刷题(持续更新) 初试结束第15天, 之前简单的处理了部分毕设方面的任务, 对接下来的学习做了个简单的规划 决定每天开始刷几道力扣题提高一下算法的理解,不能让之前学的数据结构都忘记了 每道 ...

  7. 力扣刷题笔记--304 二维区域和检索 - 矩阵不可变 前缀和

    304 二维区域和检索 - 矩阵不可变 作者:AC_OIer 链接:https://leetcode-cn.com/problems/range-sum-query-2d-immutable/solu ...

  8. ​力扣解法汇总728-自除数

    目录链接: 力扣编程题-解法汇总_分享+记录-CSDN博客 GitHub同步刷题项目: https://github.com/September26/java-algorithms 原题链接: 力扣 ...

  9. 力扣解法汇总2043-简易银行系统

    目录链接: 力扣编程题-解法汇总_分享+记录-CSDN博客 GitHub同步刷题项目: https://github.com/September26/java-algorithms https://g ...

  10. ​力扣解法汇总2315. 统计星号

    目录链接: 力扣编程题-解法汇总_分享+记录-CSDN博客 GitHub同步刷题项目: https://github.com/September26/java-algorithms 原题链接:力扣 描 ...

最新文章

  1. HBA and WWN
  2. JSONObject.fromObject--JSON与对象的转换
  3. MySQL — 索引的慢查询优化与 B+ 树
  4. yolo3(目标检测)实测
  5. unix、linux 命令
  6. 百(垃)度(圾)之星初赛B hdu6114
  7. AngularJS中service,factory,provider的区别(转载:http://my.oschina.net/tanweijie/blog/295067)...
  8. 阿里云多机部署Fabric 1order节点多个peer节点
  9. c#获取部分DRAW
  10. SharePoint 2019 预览版下载地址(中文)
  11. 文字转语音文件现成工具
  12. 生鲜配送企业如何高效管理订单,为企业降本增效?
  13. BOM(材料清单)整理及文件格式说明
  14. allegro设置差分线
  15. 【论文笔记】Towards Universal Sequence Representation Learning for Recommender Systems
  16. 网络编程(36)—— 线程安全函数和非线程安全函数
  17. 35岁不交社保,每年存1万块,存20年,够养老吗?
  18. 自制WIFI放大器(信号真的有增强)
  19. EasyUI/TopJUI可编辑表格的列根据返回数据判断是使用 combobox 还是 numberbox
  20. vue打卡日历_打卡日历,日历前端实现,日历特殊标识后端提供(Vue)

热门文章

  1. 汇编指令——bic(位清除)、orr(位或)、eor (异或)
  2. 如果在魔兽世界中,做一个合格野性德
  3. less css基础教程
  4. CVPR历年best paper(2000-2018)
  5. SVG霍比特人电影标题样式
  6. PHP在线考试系统源码 在线答题 在线批改
  7. poi读取excel教程
  8. svm神经网络葡萄酒matlab,SVM神经网络的数据分类预测--葡萄酒种类识别
  9. python七巧板房子_七巧板拼图技巧,房子用简单的七巧板怎么拼 请给图
  10. java拼图游戏难度怎么分级_拼图游戏有什么技巧吗?