力扣437(前缀和解法)
第七十三天 --- 力扣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(前缀和解法)相关推荐
- 力扣的组合总和解法 (Python)
力扣的组合总和解法 题目描述: 给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candidat ...
- 买卖股票的最佳时机——力扣121题
买卖股票的最佳时机--力扣121题 暴力解法 从前往后,不断将元素之间进行两两比较(类似冒泡排序中),然后不断更新出maxProfit的值.例如数组[7,1,5,3,6,4]中,从7开始,则7 -&g ...
- 力扣编程题-解法汇总
一.力扣链接: 题库 - 力扣 (LeetCode) 全球极客挚爱的技术成长平台 备注:以后每个工作日从前往后刷一道题,然后再加一道每日新题.每天两道题. 二.模版: 标题: 力扣解法汇总5-正则表达 ...
- LeetCode 第 59 场力扣夜喵双周赛(最短路径数+迪杰斯特拉、动态规划+最长公共前缀问题) / 第255场周赛(二进制转换,分组背包,子集还原数组(脑筋急转弯))
第 59 场力扣夜喵双周赛 两道400多五百,后两道都写出代码来了,但是都有问题,哭辽- 还有刚开始第一道测试好慢,搞心态了 5834. 使用特殊打字机键入单词的最少时间 有一个特殊打字机,它由一个 ...
- 力扣解法汇总954-二倍数对数组
目录链接: 力扣编程题-解法汇总_分享+记录-CSDN博客 GitHub同步刷题项目: https://github.com/September26/java-algorithms 原题链接:力扣 描 ...
- 力扣牛客每日刷题(Python解法持续更新)
力扣牛客每日刷题(持续更新) 初试结束第15天, 之前简单的处理了部分毕设方面的任务, 对接下来的学习做了个简单的规划 决定每天开始刷几道力扣题提高一下算法的理解,不能让之前学的数据结构都忘记了 每道 ...
- 力扣刷题笔记--304 二维区域和检索 - 矩阵不可变 前缀和
304 二维区域和检索 - 矩阵不可变 作者:AC_OIer 链接:https://leetcode-cn.com/problems/range-sum-query-2d-immutable/solu ...
- 力扣解法汇总728-自除数
目录链接: 力扣编程题-解法汇总_分享+记录-CSDN博客 GitHub同步刷题项目: https://github.com/September26/java-algorithms 原题链接: 力扣 ...
- 力扣解法汇总2043-简易银行系统
目录链接: 力扣编程题-解法汇总_分享+记录-CSDN博客 GitHub同步刷题项目: https://github.com/September26/java-algorithms https://g ...
- 力扣解法汇总2315. 统计星号
目录链接: 力扣编程题-解法汇总_分享+记录-CSDN博客 GitHub同步刷题项目: https://github.com/September26/java-algorithms 原题链接:力扣 描 ...
最新文章
- HBA and WWN
- JSONObject.fromObject--JSON与对象的转换
- MySQL — 索引的慢查询优化与 B+ 树
- yolo3(目标检测)实测
- unix、linux 命令
- 百(垃)度(圾)之星初赛B hdu6114
- AngularJS中service,factory,provider的区别(转载:http://my.oschina.net/tanweijie/blog/295067)...
- 阿里云多机部署Fabric 1order节点多个peer节点
- c#获取部分DRAW
- SharePoint 2019 预览版下载地址(中文)
- 文字转语音文件现成工具
- 生鲜配送企业如何高效管理订单,为企业降本增效?
- BOM(材料清单)整理及文件格式说明
- allegro设置差分线
- 【论文笔记】Towards Universal Sequence Representation Learning for Recommender Systems
- 网络编程(36)—— 线程安全函数和非线程安全函数
- 35岁不交社保,每年存1万块,存20年,够养老吗?
- 自制WIFI放大器(信号真的有增强)
- EasyUI/TopJUI可编辑表格的列根据返回数据判断是使用 combobox 还是 numberbox
- vue打卡日历_打卡日历,日历前端实现,日历特殊标识后端提供(Vue)