sum(B) * (N - K) = sum(C) * K
sum(B) * N = (sum(B) + sum(C)) * K
sum(B) / K = (sum(B) + sum(C)) / N
sum(B) / K = sum(A) / N
def splitArraySameAverage(self, A: List[int]) -> bool:
n = len(A)
avg = sum(A) / n
for i in range(1, n // 2 + 1):
for combination in combinations(A, i):
if abs(sum(combination) - avg * i) < 1e-6:
return True
return False
def splitArraySameAverage(self, A: List[int]) -> bool:
n = len(A)
avg = sum(A) / n
for i in range(1, n // 2 + 1):
for s in combinationSum(A, i):
if abs(s - avg * i) < 1e-6:
return True
return False
class Solution(object):
def splitArraySameAverage(self, A):
from fractions import Fraction
N = len(A)
total = sum(A)
A = [a - Fraction(total, N) for a in A] # 转化后的 A,免于计算 sum
if N == 1: return False
S1 = set() # 所有 B 可能的和的集合
for i in range(N//2):
# {a + A[i] for a in S1} 在之前选择的基础上选择 A[i] 的新集合
# {A[i]} 是仅选择 A[i] 的新集合
# S1 是不选择 A[i] 的集合
# | 是集合并操作
S1 = {a + A[i] for a in S1} | S1 | {A[i]}
if 0 in S1: return True
S2 = set() # 所有 C 可能的和的集合
for i in range(N//2, N):
S2 = {a + A[i] for a in S2} | S2 | {A[i]}
if 0 in S2: return True
# 如果 S1 和 S2 都没有和为 0 的组合。那么我们就需要从 S1 和 S2 分别找一个 a 和 b,看其和是否能达到 0. 如果可以,说明也能满足题意
# 为了避免 B 或者 C 为空,我们增加一个这样的判断: (ha, -ha) != (sleft, sright)
sleft = sum(A[i] for i in range(N//2))
sright = sum(A[i] for i in range(N//2, N))
return any(-ha in S2 and (ha, -ha) != (sleft, sright) for ha in S1)