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
解題思路
此題有兩種方法解決,如下所示:
A
實現程式碼
暴力法
/** * 985. 查詢後的偶數和 * @param A * @param queries * @return */ public int[] sumEvenAfterQueries(int[] A, int[][] queries) { for(int i=0;i<queries.length;i++){ // 值 int val=queries[i][0]; // 索引 int index=queries[i][1]; // 進行特定索引的元素累加 A[index]=A[index]+val; // 偶數之和 int evenSum=0; for(int j=0;j<A.length;j++){ if(A[j]%2==0){ evenSum+=A[j]; } } result[i]=evenSum; } return return result; }
雙指標法
/** * 985. 查詢後的偶數和 * @param A * @param queries * @return */ public int[] sumEvenAfterQueries(int[] A, int[][] queries) { int[] result=new int[queries.length]; // 偶數之和 int evenSum=0; for(int a:A){ if(a%2==0){ evenSum+=a; } } for(int i=0;i<queries.length;i++){ // 值 int val=queries[i][0]; // 索引 int index=queries[i][1]; //修改前的元素 int before=A[index]; //修改後的元素 int after=A[index]+val; A[index]=after; if(before%2==0 && after%2!=0){//修改前為偶數,修改後為奇數 evenSum-=before; }else if(before%2==0 && after%2==0){//修改前為偶數,修改後為偶數 evenSum=evenSum-before+after; }else if(before%2!=0 && after%2==0){//修改前為奇數數,修改後為偶數 evenSum+=after; }else{//修改前為奇數,修改後為奇數 //什麼都不做 } result[i]=evenSum; } return result; }