05 August 2008
给出一个整数数组 A 和一个查询数组 queries。
对于第 i 次查询,有 val = queries[i][0], index = queries[i][1],我们会把 val 加到 A[index] 上。然后,第 i 次查询的答案是 A 中偶数值的和。
(此处给定的 index = queries[i][1] 是从 0 开始的索引,每次查询都会永久修改数组 A。)
返回所有查询的答案。你的答案应当以数组 answer 给出,answer[i] 为第 i 次查询的答案。
尝试不断调整和 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。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Solution {
public int[] sumEvenAfterQueries(int[] nums, int[][] queries) {
int S = 0;
for (int x : nums)
if (x % 2 == 0)
S += x;
int[] result = new int[queries.length];
for (int i = 0; i < queries.length; ++i) {
int val = queries[i][0], index = queries[i][1];
if (nums[index] % 2 == 0) {
S -= nums[index];
}
nums[index] += val;
if (nums[index] % 2 == 0) {
S += nums[index];
}
result[i] = S;
}
return result;
}
}