title
给定的整数数组 A ,我们要将 A数组 中的每个元素移动到 B数组 或者 C数组中。(B数组和C数组在开始的时候都为空)
返回true ,当且仅当在我们的完成这样的移动后,可使得B数组的平均值和C数组的平均值相等,并且B数组和C数组都不为空。
示例:
输入:
[1,2,3,4,5,6,7,8]
输出: true
解释: 我们可以将数组分割为 [1,4,5,8] 和 [2,3,6,7], 他们的平均值都是4.5。
注意:
A数组的长度范围为[1, 30].A[i]的数据范围为[0, 10000].
solution
class Solution:
def splitArraySameAverage(self, nums: List[int]) -> bool:
import fractions
la = len(nums)
if la <= 1:
return False
nums = [x * la for x in nums]
sumA = sum(nums)
mean = sumA // la
nums = [x - mean for x in nums]
L = {nums[0]}
for i in range(1, la // 2):
L = {nums[i] + v for v in L} | L | {nums[i]}
if 0 in L:
return True
R = {nums[la // 2]}
for i in range((la // 2) + 1, la):
R = {nums[i] + v for v in R} | R | {nums[i]}
if 0 in R:
return True
sl = sum(nums[i] for i in range(la // 2))
sr = sum(nums[i] for i in range(la // 2, la))
return any(-l in R and (l, -l) != (sl, sr) for l in L)