目标和(Target Sum)问题递归实现结果异常原因咨询
错误原因分析
两个函数的核心差异是递归终止条件的逻辑,第一个函数的终止条件完全不符合题目要求:
- 题目明确要求必须给
nums中所有整数都添加正负号后计算结果,也就是说只有把数组里的所有元素都处理完毕(数组为空),才能判断当前和是否等于target,这才算有效表达式。 - 第一个
targetsum函数把「当前和等于target」的判断放在了「数组是否为空」的判断前面,只要中途计算的和等于目标值,不管还有多少元素没处理,直接返回1终止递归,会导致两类计数错误:- 误统计无效路径:中间和等于target,但剩余元素处理完后最终和不等于target的路径,被算成有效路径多计数
- 漏统计有效路径:中间和等于target,剩余元素处理完后最终和也等于target的多条不同路径,被合并成1条计数少统计
对应你的测试用例nums = [1,1,1,1,1]、target=3的场景:比如+1+1+1+1-1和+1+1+1-1+1是两条完全独立的有效路径,但是在第一个函数执行时,处理完前3个1后当前和已经是3,函数直接返回1,不会继续处理剩下的2个1,这两条路径被合并成1次计数,直接少算了1次,其他多算和少算的部分抵消后,最终得到错误结果4。
第二个dfs函数的逻辑完全符合要求:只有当数组为空(所有元素处理完毕)时,才判断当前和是否等于target,所以返回正确结果5。
内容的提问来源于stack exchange,提问作者Pranav M
相关产品推荐
相关产品推荐

