You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

LeetCode统计最大按位或子集数 两段递归实现结果差异原因求教

问题原因分析

核心差异:计数逻辑的时机错误

两版代码的核心差异在于计数的触发时机,第一版逻辑存在重复计数的问题,我们以示例nums = [3,1](maxval = 3)走一遍递归流程就能清晰看到问题:

第一版错误代码执行流程

第一版helper逻辑是进入函数先判断当前val是否等于maxval,满足就计数:

  1. 初始调用helper(nums, 0, 0, 3):val=0≠3,不计数,i=0<2,继续递归
  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,直接返回
  3. 第二个分支:不选索引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会直接计数,把不符合要求的空集算入结果。

第二版正确代码执行流程

第二版helper逻辑是仅当选中当前元素后,OR结果等于maxval才计数:

  1. 初始调用helper(nums, 0, 0, 3):i=0<2
    • 计算选中当前元素的结果:0|3=3 == maxval,counter +=1 → counter=1
    • 继续递归两个分支
  2. 第一个分支:选索引0的元素,调用helper(nums, 3, 1, 3):i=1<2
    • 计算选中当前元素的结果:3|1=3 == maxval,counter +=1 → counter=2
    • 后续递归i=2直接返回,无新增计数
  3. 第二个分支:不选索引0的元素,调用helper(nums, 0, 1, 3):i=1<2
    • 计算选中当前元素的结果:0|1=1≠3,不计数
    • 后续递归无新增计数
      最终得到counter=2,正好是正确结果。
      逻辑正确性:每次计数都对应「选中一个新元素」的操作,每个非空子集对应唯一的选中元素组合,不会出现重复计数,也不会统计空集。

内容的提问来源于stack exchange,提问作者user8386434

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 01:45:03