classSolution:defsplitArraySameAverage(self, nums: List[int])->bool:# 折半搜索例题# SumA / LenA = Sum / Len# 为了方便,变成0的Sum
n =len(nums)
s =sum(nums)if n ==1:returnFalse# 很优秀的一步for i inrange(n):
nums[i]= nums[i]* n - s # mean = 0#print(nums)# 折半搜索: O(n * 2 ** (n / 2))
m = n //2# 前半爆搜
left =set()for i inrange(1,1<< m):
tot =sum(x for j, x inenumerate(nums[:m])if(i >> j)&1==1)if tot ==0:returnTrue
left.add(tot)# 后半爆搜
rSum =sum(nums[m:])for i inrange(1,1<<(n - m)):
tot =sum(x for j, x inenumerate(nums[m:])if(i >> j)&1==1)if tot ==0:returnTrue# 跟前一半形成相反# tot不能为rSum, 否则对应的前面也会取满# 真不可能是0... 所以必然会取满if-tot in left and tot != rSum:returnTruereturnFalse