题目
给出一个整数数组 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 次查询的答案。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sum-of-even-numbers-after-queries
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
我的代码
class Solution {
public int[] sumEvenAfterQueries(int[] A, int[][] queries) {
int[] ans = new int[A.length];
// caculate original even sum
int even_sum = 0;
for (int i=0; i<A.length; i++) {
if(A[i]%2 == 0){
even_sum += A[i];
}
}
// queries
for (int i=0; i<queries.length; i++){
//change A
int index = queries[i][1];
int old = A[index];
A[index] += queries[i][0];
if(old%2 == 0){
if(A[index]%2 == 0){
even_sum = even_sum - old + A[index];
}else{
even_sum = even_sum - old;
}
}else{
if(A[index]%2 == 0){
even_sum = even_sum + A[index];
}
}
ans[i] = even_sum;
}
return ans;
}
}
小结
这个代码的主要思路源于我愿意每次查询后遍历A数组求和,所以事先算好偶数和,每次查询后A数组改变,对应改变偶数和。但是结果也不是特别理想,不知道是为何,可以看一看。
他人代码
class Solution {
public int[] sumEvenAfterQueries(int[] A, int[][] queries) {
int length = A.length;
int[] result = new int[length];
int res = 0;
for(int i = 0; i < length; i ++)
{
if(A[i] % 2 == 0)
{
res += A[i];
}
}
for(int i = 0; i < queries.length; i ++)
{
int before = A[queries[i][1]];
A[queries[i][1]] += queries[i][0];
if(before % 2 == 0)
{
res -= before;
}
if(A[queries[i][1]] % 2 == 0)
{
res += A[queries[i][1]];
}
result[i] = res;
}
return result;
}
}
还是我的逻辑过于繁琐,确实,只要原来是偶数,就减去,新的数如果是偶数,就增加。我的思路只有一半好,但并没有贯彻到底的好。