LeetCode.985-查詢後偶數的總和(Sum of Even Numbers After Queries)

這是悅樂書的第370次更新,第398篇原創

java

01 看題和準備

今天介紹的是LeetCode算法題中Easy級別的第232題(順位題號是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]。
在向A[0]加1後,數組爲[2,2,3,4],偶數值之和爲2 + 2 + 4 = 8。
在向A[1]加-3後,數組爲[2,-1,3,4],偶數值之和爲2 + 4 = 6。
在向A[0]加上-4後,數組爲[-2,-1,3,4],偶數值之和爲-2 + 4 = 2。
在向A[3]加2後,數組爲[-2,-1,3,6],偶數值之和爲-2 + 6 = 4。優化

注意翻譯

  • 1 <= A.length <= 10000code

  • -10000 <= A[i] <= 10000索引

  • 1 <= queries.length <= 10000class

  • -10000 <= queries[i][0] <= 10000基礎

  • 0 <= queries[i][1] <A.length

02 第一種解法

直接翻譯題目,找出queries中對應的索引和val,改變A中對應元素的的值,接着利用循環求A中偶數元素的總和,賦值給結果數組result

此解法的時間複雜度爲O(M*N)Mqueries的長度,NA的長度,空間複雜度爲O(M)Mqueries的長度。

public int[] sumEvenAfterQueries(int[] A, int[][] queries) {
    int len = queries.length;
    int[] result = new int[len];
    for (int i=0; i<len; i++) {
        A[queries[i][1]] += queries[i][0];
        result[i] = evenSum(A);
    }
    return result;
}

public int evenSum(int[] A){
    int sum = 0;
    for (int num : A) {
        if (num%2==0) {
            sum += num;    
        }
    }
    return sum;
}


03 第二種解法

第一種解法的時間複雜度過高了,還能夠再優化下。

結果數組中的值,後一位是在前一位的基礎上產生的,主要判斷A中的當前位元素值、queries中的值的奇偶性。拿題目給的示例來看,在第二次操做後,A變成了[2,-1,3,4],將第一次操做後的數組A=[2,2,3,4]中的第二個元素變成了-1,而第一次操做的偶數元素和是8,如今第二個元素變成了奇數,就須要將第一次加的2給減掉,因此第二次操做後的偶數和變成了8-2=6,剩下的幾步操做均可以這樣理解。

所以,咱們就須要判斷當前要操做的的A[i]奇偶queries[i][0]奇偶,能夠分爲四種狀況:

第一種狀況queries[i][0]爲偶數、A[i]也爲偶數,即前一次的求和中有A[i],只需加上queries[i][0]的值便可,即sum = sum + queries[i][0]

第二種狀況queries[i][0]爲偶數、A[i]爲奇數,即前一次的求和中沒有A[i],而且A[i]加上queries[i][0]後也是奇數,因此不用更新sum的值。

第三種狀況queries[i][0]爲奇數、A[i]爲偶數,即前一次的求和中有A[i],如今A[i]加上queries[i][0]後變成了奇數,須要將前一次求和中的A[i]減掉,即sum = sum - A[i]

第四種狀況queries[i][0]爲奇數、A[i]也爲奇數,即前一次的求和中沒有A[i],可是A[i]加上queries[i][0]後變成了偶數,須要把這個新的偶數加到sum上,即sum = sum + queries[i][0] + A[i]

在計算完sum的值後,將sum賦值給新數組對應位置元素,將ueries[i][0] + A[i]的值賦值給A[i],最後返回結果數組。

此解法的時間複雜度爲O(M)Mqueries的長度,空間複雜度爲O(M)Mqueries的長度。

public int[] sumEvenAfterQueries2(int[] A, int[][] queries) {
    int sum = 0, i = 0;
    for (int num : A) {
        if (num%2 == 0) {
            sum += num;
        }
    }
    int[] result = new int[queries.length];
    for (int[] arr : queries) {
        int curval = arr[0];
        int preval = A[arr[1]];
        // 作奇偶判斷
        if (curval%2 == 0) {
            if (preval%2 == 0) {
                sum = sum + curval;
            } 
        } else {
            if (preval%2 == 0) {
                sum = sum - preval;
            } else {
                sum = sum + curval + preval;
            }
        }
        A[arr[1]] += curval;
        result[i++] = sum;
    }
    return result;
}


04小結

算法專題目前已連續日更超過七個月,算法題文章238+篇,公衆號對話框回覆【數據結構與算法】、【算法】、【數據結構】中的任一關鍵詞,獲取系列文章合集。

以上就是所有內容,若是你們有什麼好的解法思路、建議或者其餘問題,能夠下方留言交流,點贊、留言、轉發就是對我最大的回報和支持!

相關文章
相關標籤/搜索