でもLeetCode.985-(クエリの後でさえ数の和)の和のお問い合わせの際

これは、喜びと喜びの最初の本である370、最初の更新398ピアンオリジナル

01の質問と準備ができて見えます

今日導入さLeetCodeにおける演算問題Easy最初のレベル232(全体のタイトル番号がタイトル985)。整数Aの配列とクエリのクエリ配列があります。

i番目のクエリのためにval = queries[i][0]index = queries[i][1]私たちはしますvalに追加しますA[index]その後、iクエリへの答えはA偶数値の合計。(ここで、所定のindex = queries[i][1]ゼロベースのインデックスであり、各クエリは、配列を変更しますA。)

すべての答えクエリを返します。あなたの答えアレイはanswerしなければならないanswer[i]最初として使用するiクエリの答え。例えば:

入力:A = [1,2,3,4]、クエリ = [1,0]、[ - 3,1]、[ - 4,0]、[2,3]
出力:[8,6、 2,4]
説明:最初に、アレイは、[1,2,3,4]です。1を加えた後、アレイは[2,2,3,4]、および2 + 2 + 4 = 8の偶数値。-3アレイを加えた後、[2、3,4]であり、和は2 + 4 = 6の偶数値です。後添加-4アレイ[-2、-1,3,4]であり、そして-2偶数値+ 2 = 4。2を加えた後、アレイは[-2、1,3,6-]であり、そして-2偶数値+ 4 = 6。
A[0]
A[1]
A[0]
A[3]

注意

  • 1 <= A.length <= 10000

  • -10000 <= A [i]が<= 10000

  • 1 <= queries.length <= 10000

  • -10000 <=クエリ[I] [0] <= 10000

  • 0 <=クエリ[I] [1] <A.length

02第一溶液

見つけるために直接変換の問題、queries対応するインデックスとval環状続いて、Aの対応する要素の値を変更することは、検索A結果の配列に割り当てられても要素の和をresult

今回の複雑さのソリューションがあるO(M*N)Mqueries長さNA長さは、空間的な複雑さO(M)Mのためのqueries長さ。

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第二の溶液

第1の溶液の時間の複雑さは、することができ、その後の最適化が高すぎます。

配列内の結果値は、決定主の一つに基づいて以前の世代の後でA現在のビット要素の値を、queries中パリティ第2の動作の後に、例えば、ビューのタイトルを取るAなり[2,-1,3,4]、アレイの第1の動作の後にA=[2,2,3,4]された第2の要素の-1になり、さらに第一の操作の要素および8今、2番目の要素は奇数となり、最初にも、第二の動作を失い、6 = 8-2になるように2を追加する必要があり、操作の残りのステップとすることができますこのことを理解しています。

したがって、我々は、現在の操作を決定する必要がパリティパリティが 4例に分けることができます。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]

第4のケースqueries[i][0]奇数、A[i]また奇数以前の合計のない数、すなわちA[i]、しかしA[i]加えることqueries[i][0]さえなりましたが、でも追加この新しいを配置する必要がありsum、すなわち、sum = sum + queries[i][0] + A[i]

算出した後sumの合計の値を、新たな配列要素に対応する位置に割り当てられueries[i][0] + A[i]た値が割り当てられA[i]、その結果アレイを返します。

今回の複雑さのソリューションがあるO(M)Mqueries空間的な複雑さの長さO(M)Mのためのqueries長さ。

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まとめ

テーマ別のアルゴリズムは、継続的にされている日以上7ヶ月、特集記事のアルゴリズム238件の +記事、公衆番号]ダイアログボックスの返信[ データ構造とアルゴリズム ]、[ アルゴリズム ]、[ データ構造 ]のいずれかの記事のコレクションのシリーズを取得するキーワード。

それは、すべてだあなたは何か良い解決策のアイデア、提案やその他の問題がある場合、あなたは以下のコメントを交換することができ、親指、メッセージ転送およびサポートは、私にとっての最大の報酬です!

おすすめ

転載: www.cnblogs.com/xiaochuan94/p/11123089.html