LeetCode 3432. 统计元素和差值为偶数的分区方案数
问题描述
给定一个数组 nums,需要将它分割成两个非空数组。对左子数组和右子数组先求元素和再做差,统计并返回差值为偶数的分区方案数。
前缀和的发现
用前缀和优化时间复杂度到 O(n),设前缀和数组为 s,其中 s[i] 表示前 i 个元素的和。
对于分割点 i(左半部分是 s[i],右半部分是 s[n-1]-s[i]):
差值 = s[i] - (s[n-1] - s[i]) = 2*s[i] - s[n-1]
现在观察差值的奇偶性:
2*s[i]一定是偶数(乘以2的结果)- 差值的奇偶性只取决于
s[n-1]的奇偶性
关键发现 :s[i] - (s[n-1] - s[i]) 是否为偶数,只和总和 s[n-1] 的奇偶性有关!
最终解法
go
func countPartitionsDiff(nums []int) int {
sum := 0
for _, v := range nums {
sum += v
}
// 总和为奇数:差值一定为奇数,返回0
// 总和为偶数:所有分割点都有效,返回 n-1
if sum % 2 != 0 {
return 0
}
return len(nums) - 1
}
复杂度分析
- 时间复杂度:O(n),只需遍历一次求总和
- 空间复杂度:O(1),常数级别额外空间
核心发现
差值为偶数的条件完全由总和的奇偶性决定,与具体的分割位置无关。