805. 数组的均值分割
题面
给定你一个整数数组 nums
我们要将 nums
数组中的每个元素移动到 A
数组 或者 B
数组中,使得 A
数组和 B
数组不为空,并且 average(A) == average(B)
。
如果可以完成则返回true
, 否则返回 false
。
注意:对于数组 arr
, average(arr)
是 arr
的所有元素的和除以 arr
长度。
数据范围
- $1 \leq n \leq 30$
- $0 \leq nums[i] \leq 10^4$
题解
由于$1 \leq n \leq 30$, 考虑折半搜索。
分别对左侧数组和右侧数组进行二进制枚举,假设左侧选择了 $lc$ 个数字,和为 $ls$, 右侧选择了 $rc$ 个数字,和为$rs$,假设数组和为 $S$, 若要满足平均值相等,则有:
化简可得:$S\times lc - n \times ls$ = $-(S \times rc - n \times rs)$
预处理 $S\times lc - n \times ls$ 的值
- 注意边界情况,左侧和右侧不能同时全选
代码
1 | class Solution { |