python-leetcode-1664. 生成平衡数组的方案数

1664. 生成平衡数组的方案数 - 力扣(LeetCode)

可以使用前缀和的方法来高效计算删除每个元素后是否满足平衡数组的条件。核心思路如下:

  1. 定义前缀和

    • 计算 odd[i]:表示 nums[0]nums[i] 之间 奇数下标 的元素和。
    • 计算 even[i]:表示 nums[0]nums[i] 之间 偶数下标 的元素和。
  2. 计算删除后的奇偶前缀和

    • 若删除 nums[i],则 i 及之后的元素索引都会发生变化。
    • 需要计算删除 nums[i] 后的 新偶数下标之和新奇数下标之和,并进行比较。
  3. 遍历判断

    • 如果删除 nums[i] 后的奇偶和相等,则计数加一。

代码实现:

def waysToMakeFair(nums):
    n = len(nums)
    odd_prefix = [0] * (n + 1)  # 记录到 i 位置的奇数下标前缀和
    even_prefix = [0] * (n + 1)  # 记录到 i 位置的偶数下标前缀和

    # 计算奇数和偶数下标前缀和
    for i in range(n):
        odd_prefix[i + 1] = odd_prefix[i]
        even_prefix[i + 1] = even_prefix[i]
        if i % 2 == 0:
            even_prefix[i + 1] += nums[i]
        else:
            odd_prefix[i + 1] += nums[i]

    count = 0
    for i in range(n):
        # 删除 nums[i] 之前的偶数和奇数和
        even_sum = even_prefix[i]
        odd_sum = odd_prefix[i]
        
        # 删除 nums[i] 之后的调整
        new_even_sum = odd_sum + (even_prefix[n] - even_prefix[i + 1])
        new_odd_sum = even_sum + (odd_prefix[n] - odd_prefix[i + 1])
        
        if new_even_sum == new_odd_sum:
            count += 1

    return count

时间复杂度分析

  • 预计算 odd_prefixeven_prefix 需要 O(n)
  • 遍历 nums 进行判断也需要 O(n)
  • 总时间复杂度为 O(n),适用于大规模数据。

示例

nums = [2, 1, 6, 4]
print(waysToMakeFair(nums))  # 输出: 1

解释

  • 删除 nums[0][1, 6, 4] 不是平衡数组。
  • 删除 nums[1][2, 6, 4] 是平衡数组,满足条件。

这样,我们可以高效计算删除某个元素后能否形成平衡数组,并返回满足条件的删除方案数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值