这个题解使用动态规划的思路来判断是否可以将数组分割成两个平均值相等的子数组。首先判断数组总和 s 是否存在可以被 n 整除的子数组长度 i,如果不存在则直接返回 False。然后使用一个长度为 m+1 的 dp 数组,其中 m 为数组长度的一半,dp[i] 表示长度为 i 的子数组的所有可能的元素和集合。遍历数组 nums 中的每个元素,对于每个 dp[i-1] 中的元素和 x,判断 x+num 是否等于 s*i/n,即是否存在一个长度为 i 平均值等于 s/n 的子数组,如果存在则返回 True。最后如果找不到则返回 False。
时间复杂度: O(n * m * sum(nums))
空间复杂度: O(m * sum(nums))
class Solution:
def splitArraySameAverage(self, nums: List[int]) -> bool:
n = len(nums)
m = n // 2
s = sum(nums)
# 判断是否存在长度为 i 的子数组平均值等于 s/n
if all(s * i % n for i in range(1, m + 1)):
return False
dp = [set() for _ in range(m + 1)] # dp[i] 表示长度为 i 的子数组的所有可能的元素和集合
dp[0].add(0)
for num in nums: # 遍历数组 nums 中的每个元素
for i in range(m, 0, -1): # 遍历 m 到 1
for x in dp[i - 1]: # 遍历 dp[i-1] 中的每个元素和
curr = x + num
if curr * n == s * i: # 判断是否存在长度为 i 平均值等于 s/n 的子数组
return True
dp[i].add(curr)
return False