leetcode-12:1664. 生成平衡数组的方案数
Posted 坚持不懈的大白
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode-12:1664. 生成平衡数组的方案数相关的知识,希望对你有一定的参考价值。
原题为:
给你一个整数数组 nums 。你需要选择 恰好 一个下标(下标从 0 开始)并删除对应的元素。请注意剩下元素的下标可能会因为删除操作而发生改变。
比方说,如果 nums = [6,1,7,4,1] ,那么:
- 选择删除下标 1 ,剩下的数组为 nums = [6,7,4,1] 。
- 选择删除下标 2 ,剩下的数组为 nums = [6,1,4,1] 。
- 选择删除下标 4 ,剩下的数组为 nums = [6,1,7,4] 。
如果一个数组满足奇数下标元素的和与偶数下标元素的和相等,该数组就是一个 平衡数组 。
请你返回删除操作后,剩下的数组 nums 是 平衡数组 的 方案数 。
【难度】:中等
示例如下:
思路:虽然这题给出的题目标签为动态规划,但是小编一看到这个题目就想到运用数学知识解决这个问题。如果一开始我们先将题目给出的数组的偶数下标元素的和与奇数下标元素的和之差计算出来(小编代码中用o_j_c表示)。之后就是删除数组某个下标的元素了,这需要循环遍历一次原数组,通过一个示例,你可以发现如下规律:
0 1 2 3 4
6 1 7 4 1
o_j_c = 6+7+1-1-4=9
i = 0,
下标为0左边为空,右边为 1 7 4 1,此时右边下标为0 1 2 3,此时结果为1+4-7-1=-3,这结果正好是(o_j_c-6)*-1=-3,为什么乘以-1,应为删除下标为0的元素6之后,原来奇数下标和偶数下标位置互换了(就是原来偶数下标的变成相应的奇数下标,奇数下标的变成相应的偶数下标),下同。
i = 1,
下标为1左边为6,右边为7 4 1,此时右边下标为1 2 3,此时结果为6+4-7-1=2,这结果正好是(o_j_c+1-6)*-1+6=2
i = 2,
下标为2左边为 6 1,右边为4 1,此时结果为6+4-1-1=8,这结果正好是(o_j_c-7-(6-1))*-1+(6-1)=8
i = 3,
下标为3左边为6 1 7,右边为 1,此时结果为6+7-1-1=11,这结果正好是(o_j_c+4-(6-1+7))*-1+(6-1+7)=11
i=4,
下标为4左边为6 1 7 4,右边为空,此时结果为6+7-1-4=8,这结果正好是(o_j_c-1-(6-1+7-4))*-1+(6-1+7-4)=8
描述可能不是很清楚哈!
参考代码如下:
class Solution(object):
def waysToMakeFair(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
n = len(nums)
o_j_c = 0
for i in range(n):
o_j_c += nums[i] if i%2 == 0 else -1 * nums[i]
o_j_c_2 = 0
res = 0
for i in range(n):
v = nums[i]
if i%2 == 0:
v = -1 * nums[i]
if o_j_c_2 + (o_j_c + v - o_j_c_2) * -1 == 0:
res += 1
o_j_c_2 += nums[i] if i%2 == 0 else -1 * nums[i]
return res
if __name__ == '__main__':
a = Solution()
print(a.waysToMakeFair([1,2,3]))
运行结果:
以上是关于leetcode-12:1664. 生成平衡数组的方案数的主要内容,如果未能解决你的问题,请参考以下文章
[SDOI2016] 生成魔咒 - 后缀数组,平衡树,STL,时间倒流