题目
思路
这道题的数据范围为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