LeetCode 494暴力递归方案result作为类属性可运行作为参数传递失败原因
问题原因分析
- 核心根因:该问题由Java仅支持值传递的参数机制和基本数据类型的特性共同导致。
- 第一种实现正常的原因:
代码中result是类的实例成员变量,所有递归调用的helper方法共享该实例的同一个result属性。每次匹配到目标和时的自增操作都是直接修改该共享变量,改动全局生效,最终返回的是累计后的正确计数。 - 第二种实现无法得到正确结果的原因:
int属于Java基本数据类型,当你把result作为入参传入helper方法时,传递的是原值的副本,每个递归栈帧里的result都是独立的局部变量。你在helper中执行的result++仅修改当前栈帧的局部副本,既不会影响findTargetSumWays中定义的原始result变量,也不会同步到其他递归调用的result副本,所有计数操作都没有落到最终要返回的变量上,最终返回值永远是初始值0。 - 如果要使用传参的方式实现,可以选择两种修改方案:
- 把
result改为长度为1的int数组:数组属于引用类型,参数传递时传递的是引用的副本,所有调用都指向堆中同一个数组对象,修改数组内的元素会全局生效:
class Solution { public int findTargetSumWays(int[] nums, int S) { int[] result = new int[1]; if (nums == null || nums.length == 0) return result[0]; helper(nums, S, 0, 0, result); return result[0]; } public void helper(int[] nums, int target, int pos, long eval, int[] result){ if (pos == nums.length) { if (target == eval) result[0]++; return; } helper(nums, target, pos + 1, eval + nums[pos], result); helper(nums, target, pos + 1, eval - nums[pos], result); } }- 让
helper方法返回当前递归分支的符合条件的数量,递归逐层累加:
class Solution { public int findTargetSumWays(int[] nums, int S) { if (nums == null || nums.length == 0) return 0; return helper(nums, S, 0, 0); } public int helper(int[] nums, int target, int pos, long eval){ if (pos == nums.length) { return target == eval ? 1 : 0; } return helper(nums, target, pos + 1, eval + nums[pos]) + helper(nums, target, pos + 1, eval - nums[pos]); } } - 把
内容的提问来源于stack exchange,提问作者alpha
相关产品推荐
相关产品推荐

