これは、喜びと喜びの最初の本である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)
、M
のqueries
長さN
のA
長さは、空間的な複雑さ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)
、M
のqueries
空間的な複雑さの長さ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件の +記事、公衆番号]ダイアログボックスの返信[ データ構造とアルゴリズム ]、[ アルゴリズム ]、[ データ構造 ]のいずれかの記事のコレクションのシリーズを取得するキーワード。
それは、すべてだあなたは何か良い解決策のアイデア、提案やその他の問題がある場合、あなたは以下のコメントを交換することができ、親指、メッセージ転送およびサポートは、私にとっての最大の報酬です!