LeetCode统计最大按位或子集数 两段递归实现结果差异原因求教
问题原因分析
核心差异:计数逻辑的时机错误
两版代码的核心差异在于计数的触发时机,第一版逻辑存在重复计数的问题,我们以示例nums = [3,1](maxval = 3)走一遍递归流程就能清晰看到问题:
第一版错误代码执行流程
第一版helper逻辑是进入函数先判断当前val是否等于maxval,满足就计数:
- 初始调用
helper(nums, 0, 0, 3):val=0≠3,不计数,i=0<2,继续递归 - 第一个分支:选索引0的元素,调用
helper(nums, 0|3=3, 1, 3):- val=3==maxval,counter +=1 → counter=1
- i=1<2,继续递归
- 子分支1:选索引1的元素,调用
helper(nums,3|1=3, 2, 3):- val=3==maxval,counter +=1 → counter=2
- i=2≥2,直接返回
- 子分支2:不选索引1的元素,调用
helper(nums, 3, 2, 3):- val=3==maxval,counter +=1 → counter=3
- i=2≥2,直接返回
- 第二个分支:不选索引0的元素,调用
helper(nums, 0, 1, 3):- val=0≠3,后续递归均不会触发计数,最终返回
最终得到counter=3,和正确答案2不符。
错误本质:同一个子集被多次计数。比如子集{3}(选0、不选1),在进入i=1的递归时计数1次,进入i=2的递归时又计数1次,重复统计了。
此外第一版还有潜在的空集计数问题:如果数组全为0,maxval=0,初始调用helper时val=0会直接计数,把不符合要求的空集算入结果。
- val=0≠3,后续递归均不会触发计数,最终返回
第二版正确代码执行流程
第二版helper逻辑是仅当选中当前元素后,OR结果等于maxval才计数:
- 初始调用
helper(nums, 0, 0, 3):i=0<2- 计算选中当前元素的结果:
0|3=3 == maxval,counter +=1 → counter=1 - 继续递归两个分支
- 计算选中当前元素的结果:
- 第一个分支:选索引0的元素,调用
helper(nums, 3, 1, 3):i=1<2- 计算选中当前元素的结果:
3|1=3 == maxval,counter +=1 → counter=2 - 后续递归i=2直接返回,无新增计数
- 计算选中当前元素的结果:
- 第二个分支:不选索引0的元素,调用
helper(nums, 0, 1, 3):i=1<2- 计算选中当前元素的结果:
0|1=1≠3,不计数 - 后续递归无新增计数
最终得到counter=2,正好是正确结果。
逻辑正确性:每次计数都对应「选中一个新元素」的操作,每个非空子集对应唯一的选中元素组合,不会出现重复计数,也不会统计空集。
- 计算选中当前元素的结果:
内容的提问来源于stack exchange,提问作者user8386434
相关产品推荐
相关产品推荐

