题目描述:
给定你一个整数数组 nums
我们要将 nums 数组中的每个元素移动到 A 数组 或者 B 数组中,使得 A 数组和 B 数组不为空,并且 average(A) == average(B) 。
如果可以完成则返回true , 否则返回 false 。
注意:对于数组 arr , average(arr) 是 arr 的所有元素的和除以 arr 长度。
解题思路:
类似 lc416 的状压优化方法,将集合状态压缩为一个数 state,优化递推时间。
这里有个问题是集合中有负数,不能压缩到 state 中。一个巧妙的想法是:
先遍历正数,再遍历负数
那么遇到某个子集和为负数时,必然已经遍历到负数,那么后面不可能变为 0 了,无需保存
所以只维护非负数的集合即可,可以压缩为 state
代码演示:
class Solution:
def splitArraySameAverage(self, nums: List[int]) -> bool:
n, s = len(nums), sum(nums)
mul = n//gcd(n, s)
A = [num*mul-mul*s//n for num in nums]
st = 0
for x in sorted(A[:-1], reverse=True):
st |= (st|1)<<x if x>=0 else st>>(-x)
if st & 1:
return True
return False
学习产出:
1,学习了压缩优化方法。
2,遍历集合时,可以正数和负数分开遍历。