985. Sum of Even Numbers After Queries

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. 1 <= A.length <= 10000
  2. -10000 <= A[i] <= 10000
  3. 1 <= queries.length <= 10000
  4. -10000 <= queries[i][0] <= 10000
  5. 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種情況:

  1. A[item[1]]爲奇,item[0]爲偶:這種情況無關緊要,因爲原數是奇數,並沒有計入sum,二者求和後也是奇數;
  2. A[item[1]]爲偶,item[0]爲奇:因爲二者之和爲奇,所以sum應該減去A[item[1]];
  3. 二者都爲奇:其和爲偶,sum應該加上二者之和;
  4. 二者都爲偶:其和爲偶,sum應該加上item[1]。
2019/08/22 17:19
發佈了359 篇原創文章 · 獲贊 14 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章