解决方案
方法一:调整数组和
思路与算法
让我们尝试不断调整 S,即每一步操作之后整个数组的偶数和。
我们操作数组中的某一个元素 A[index] 的时候,数组 A 其他位置的元素都应保持不变。如果 A[index] 是偶数,我们就从 S 中减去它,然后计算 A[index] + val 对 S 的影响(如果是偶数则在 S 中加上它)。
这里有一些例子:
-
如果当前情况为
A = [2,2,2,2,2]、S = 10,并且需要执行A[0] += 4操作:我们应该先令S -= 2,然后令S += 6。最后得到A = [6,2,2,2,2]与S = 14。 -
如果当前情况为
A = [1,2,2,2,2]、S = 8,同时需要执行A[0] += 3操作:我们会跳过第一次更新S的步骤(因为A[0]是奇数),然后令S += 4。 最后得到A = [4,2,2,2,2]与S = 12。 -
如果当前情况为
A = [2,2,2,2,2]、S = 10,同时需要执行A[0] += 1操作:我们先令S -= 2,然后跳过第二次更新S的操作(因为A[0] + 1是奇数)。最后得到A = [3,2,2,2,2]与S = 8。 -
如果当前情况为
A = [1,2,2,2,2]、S = 8,同时需要执行A[0] += 2操作:我们跳过第一次更新S的操作(因为A[0]是奇数),然后再跳过第二次更新S的操作(因为A[0] + 2是奇数)。最后得到A = [3,2,2,2,2]与S = 8。
这些例子充分展现了我们的算法在每一次询问操作之后应该如何调整 S 。
复杂度分析
-
时间复杂度:,其中 是数组
A的长度, 是询问queries的数量。 -
空间复杂度:,事实上我们只使用了 的额外空间。