题目
输入的例子
思路
- 子集实际上就是数组中每个数取或者不取,所以可以在递归中用两组递归情况表示:
dfs(i+1,s)
dfs(i+1,s|nums[i])
2.递归出口:
if i==n:
nonlocal val,cnt
if s>val:
val,cnt=s,1
elif s==val:
cnt+=1
else:
1中两种情况
3.按位或运算为|
a|b>=a
代码(包括注释)
class Solution:
def countMaxOrSubsets(self,nums:List[int])->int:
val=0#按位异或求的的最大值
cnt=1#最大值子数组的个数
n=len(nums)
def dfs(i,s):#s记录当前异或求得的值
if i==n:
nonlocal val,cnt#说明val和cnt不是全局变量
if s>val:
val.cnt=s,1
elif s==val:
cnt+=1
else:
dfs(i+1,s)#不加入当前数字
dfs(i+1,s|nums[i])#加入当前的数字进行异或运算
dfs(0,0)
return cnt