805. 数组的均值分割

2021/09/13 leetcode 共 720 字,约 3 分钟

title

problem link

给定的整数数组 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)

Search

    Table of Contents