LeetCode 1664. 生成平衡数组的方案数(前缀和)

题目

思路

  这道题的数据范围为1e5,因此不能通过暴力方法解题。解答本题的关键在于当删除一个数以后,如何计算剩下的数组中奇数下标项和偶数下标项之和。进一步思考后会发现,当删去一个数以后,该数之后的奇偶性会发生交换。因此可以考虑用前缀和处理出原数组中奇数下标项和偶数下标项的前缀和,之后再遍历数组。对于删除一个确定的项,剩下数组的奇数项之和等于原数组中该项之前的奇数项之和,再加上该项之后的偶数项之和,偶数项之和的计算方式类似。通过这种方式就可以遍历一遍数组中找出最终的答案。在计算原数组的前缀和时有一个小技巧,就是将记录前缀和的数组的大小均设置成数组长度加1,然后第一项赋值成0。这样方便处理遍历过程中遇到第一项的情况。

代码

class Solution:
    def waysToMakeFair(self, nums: List[int]) -> int:
        n=len(nums)
        if n==1:
            return 1
        odd=[0 for i in range(n+1)]
        even=[0 for i in range(n+1)]
        ans=0
        for i in range(1,n+1):
            if i&1:
                even[i]=even[i-1]
                odd[i]=odd[i-1]+nums[i-1]
            else:
                even[i]=even[i-1]+nums[i-1]
                odd[i]=odd[i-1]
        for i in range(1,n+1):
            summ1=odd[i-1]+even[n]-even[i]
            summ2=even[i-1]+odd[n]-odd[i]
            #print(summ1,summ2)
            if summ1==summ2:
                ans+=1
        return ans

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值