985. 查詢後的偶數和
給出一個整數數組
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[1] 上之後,數組爲 [2,-1,3,4],偶數值之和爲 2 + 4 = 6。 將 -4 加到 A[0] 上之後,數組爲 [-2,-1,3,4],偶數值之和爲 -2 + 4 = 2。 將 2 加到 A[3] 上之後,數組爲 [-2,-1,3,6],偶數值之和爲 -2 + 6 = 4。
提示:
1 <= A.length <= 10000
-10000 <= A[i] <= 10000
1 <= queries.length <= 10000
-10000 <= queries[i][0] <= 10000
0 <= queries[i][1] < A.length
解法一(暴力搜索,低效,超時錯誤)
//時間複雜度O(n), 空間複雜度O(1)
class Solution {
public:
vector<int> sumEvenAfterQueries(vector<int>& A, vector<vector<int>>& queries) {
int sum = 0;
for(int elem : A) {
if(elem % 2 == 0) sum += elem;
}
int k = 0;
vector<int> res(queries.size());
for(vector<int> item : queries) {
if(A[item[1]] % 2 == 0 && item[0] % 2 == 0) sum += item[0];
else if(A[item[1]] % 2 == 0 && item[0] % 2 != 0) sum -= A[item[1]];
else if(A[item[1]] % 2 != 0 && item[0] % 2 != 0) sum += A[item[1]] + item[0];
A[item[1]] += item[0];
res[k++] = sum;
}
return res;
}
};
總結:
可以每次修改之後重新計算偶數和。但是更好的做法是首先計算一次偶數和,根據每次的修改記錄調整偶數和。根據A[item[1]](待修改的數組元素值)和item[0](附加到數組元素上的值)的奇偶性,這裏要分4種情況:
- A[item[1]]爲奇,item[0]爲偶:這種情況無關緊要,因爲原數是奇數,並沒有計入sum,二者求和後也是奇數;
- A[item[1]]爲偶,item[0]爲奇:因爲二者之和爲奇,所以sum應該減去A[item[1]];
- 二者都爲奇:其和爲偶,sum應該加上二者之和;
- 二者都爲偶:其和爲偶,sum應該加上item[1]。