LeetCode 3432. 统计元素和差值为偶数的分区方案数

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),常数级别额外空间

核心发现

差值为偶数的条件完全由总和的奇偶性决定,与具体的分割位置无关。

相关推荐
王老师青少年编程17 小时前
csp信奥赛C++高频考点专项训练之贪心算法 --【哈夫曼贪心】:合并果子
c++·算法·贪心·csp·信奥赛·哈夫曼贪心·合并果子
叼烟扛炮17 小时前
C++第二讲:类和对象(上)
数据结构·c++·算法·类和对象·struct·实例化
天疆说17 小时前
【哈密顿力学】深入解读航天器交会最优控制中的Hamilton函数
人工智能·算法·机器学习
wuweijianlove18 小时前
关于算法设计中的代价函数优化与约束求解的技术7
算法
leoufung19 小时前
LeetCode 149: Max Points on a Line - 解题思路详解
算法·leetcode·职场和发展
样例过了就是过了19 小时前
LeetCode热题100 最长公共子序列
c++·算法·leetcode·动态规划
HXDGCL19 小时前
矩形环形导轨:自动化循环线的核心运动单元解析
运维·算法·自动化
谭欣辰19 小时前
C++ 排列组合完整指南
开发语言·c++·算法
代码中介商19 小时前
银行管理系统的业务血肉 —— 流程、状态机、输入校验与持久化(下篇)
c语言·算法
foundbug99920 小时前
自适应滤除直达波干扰的MATLAB实现
开发语言·算法·matlab