Perfect Sum子集和计数问题代码运行异常调试方法咨询
代码存在的问题
- 边界条件错误,未考虑数组包含0的场景:当前代码只要sum==0就直接返回1,忽略了剩余数组元素中存在0时,选或不选0都能满足sum=0的情况,会导致统计数少算。比如输入
arr=[0],n=1,sum=0,正确返回值是2(空集、选0),你的代码只会返回1。 - 备忘录数组类型不匹配:你的t数组是
vector<vector<int>>类型,但递归返回值是long long,赋值时会发生整型截断,导致存储的中间结果错误。 - 取模逻辑错误:首先
pow(10,9)+7是浮点数运算,存在精度误差,应该直接使用整型常量1000000007;其次取模仅在最后执行,中间递归相加时数值已经超出整型范围发生溢出,应该每一步相加后都执行取模操作。 - 返回值溢出风险:递归中两个结果相加时没有做溢出防护,即使是long long也可能在多次累加后溢出,配合每步取模可以避免该问题。
修复后的参考代码
const int MOD = 1000000007; class Solution{ private: vector<vector<long long>> t; public: Solution() { t.resize(1001, vector<long long> (1001,-1)); } int perfectSum(int arr[], int n, int sum) { return sumrecursive(arr, n, sum) % MOD; } long long sumrecursive(int arr[], int n, int sum){ if(n==0){ return sum == 0 ? 1 : 0; } if(t[n][sum] != -1){ return t[n][sum]; } if(arr[n-1]>sum){ return t[n][sum] = sumrecursive(arr, n-1, sum) % MOD; } else { return t[n][sum] = (sumrecursive(arr,n-1, sum-arr[n-1]) + sumrecursive(arr, n-1, sum)) % MOD; } } };
调试定位建议
- 优先构造边界测试用例验证:比如包含0的小数组、sum=0的场景、数组全为0的场景,先验证小输入下的输出是否符合预期,再排查大规模输入的问题。
- 可以在递归函数入口打印n、sum、当前返回值的日志,对比预期的递归路径和实际执行路径的差异,快速定位到逻辑错误的分支。
内容的提问来源于stack exchange,提问作者Nik
相关产品推荐
相关产品推荐

