题目描述
给出一个整数数组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次查询的答案
示例
输入:A = [1,2,3,4],queries = [[1,0],[-3,1],[-4,0],[2,3]]
输出:[8,6,2,4]
解释:
开始时,数组为[1,2,3,4]
将 1 加到A[0]上之后,数组为[2,2,3,4],偶数之和为2+2+4 = 8
将 -3 加到A[0]上之后,数组为[2,-1,3,4],偶数之和为2+4 = 6
将 -4 加到A[0]上之后,数组为[-2,-1,3,4],偶数之和为 -2+4 = 2
将 2 加到A[0]上之后,数组为[-2,-1,3,6],偶数之和为-2+6 = 4
解题思路
一、直接暴力两层for循环,每次更新数组A之后遍历求解所有偶数之和。
二、对于查询数组,每次只是修改A数组的一个值,可以使用一个集合记录开始A中偶数的索引,当修改A数组时,当增加的数为奇数,指定索引在集合中进行删除,指定索引不在集合中则加入到集合中
vector<int> sumEvenAfterQueries(vector<int>& A, vector<vector<int>>& queries) {
vector<int> res;
set<int> indexs;
set<int>::iterator it;
for(int i=0;i<A.size();i++){
if(A[i] % 2 == 0) indexs.insert(i);
}
for(int i=0;i<queries.size();i++){
int tmp = queries[i][0];
int index = queries[i][1];
it = indexs.find(index);
if(tmp % 2 != 0){
if(it == indexs.end()) indexs.insert(index);
else indexs.erase(index);
}
A[index] += tmp;
tmp = 0;
for(it = indexs.begin();it != indexs.end();it++) tmp += A[*it];
res.push_back(tmp);
}
return res;
三、操作数组中的某一个元素A[index]的时候,数组A其他位置的元素都应该保持不变。如果A[index]是偶数,要增加的值是偶数则S加上它,否则减去A[index];如果A[index]是奇数,要增加的数也是奇数,则S加上A[index]和val
vector<int> sumEvenAfterQueries(vector<int>& A, vector<vector<int>>& queries) {
vector<int> res;
int sum = 0;
for(int i=0;i<A.size();i++) if(A[i] % 2 == 0) sum += A[i];
for(int i=0;i<queries.size();i++){
int val = queries[i][0];
int index = queries[i][1];
if(A[index] % 2 == 0){
if(val % 2 == 0) sum += val;
else sum -= A[index];
}else{
if(val % 2 != 0){
int t = val + A[index];
sum += t;
}
}
res.push_back(sum);
A[index] += val;
}
return res;
}