JavaScriptで合計が特定の値になる2つの数を配列から見つける最良の方法
はじめに
まず、次のような配列を例に考えてみましょう。
var numbers = [10, 3, 40, 50, 20, 30, 100]
この配列の要素の中から、合計が80になる2つの数を探します。
解決方法
最も効率的なのは、オブジェクト(ハッシュマップ)を活用するアプローチです。各要素に対して「目標値から現在の数を引いた補完値」を記録していき、後から同じ数が出現した時点でペアが確定します。これにより、二重ループによる総当たり方式(計算量 O(n²))ではなく、線形時間 O(n) で解くことができます。
具体的には、for...of ループで配列を走査しながら、if 条件でペアの存在を判定します。
サンプルコード
function specificPairsOfSumOfTwoNumbers(numbers, totalValue) {
var storeTwoNumbersObject = {}
for (var currentNumber of numbers) {
if (storeTwoNumbersObject[currentNumber]) {
return {
firstNumber: totalValue - currentNumber,
secondNumber: currentNumber
}
}
storeTwoNumbersObject[totalValue - currentNumber] = true;
}
return false;
}
var numbers = [10, 3, 40, 50, 20, 30, 100]
console.log("The Two numbers which has the sum 80=");
console.log(specificPairsOfSumOfTwoNumbers(numbers, 80))プログラムの実行方法
上記のプログラムを実行するには、以下のコマンドを使用します。
node fileName.js
ここでは、ファイル名を demo207.js としています。
実行結果
プログラムを実行すると、以下の出力が得られます。
PS C:\Users\Amit\javascript-code> node demo207.js
The Two numbers which has the sum 80=
{ firstNumber: 50, secondNumber: 30 }仕組みの解説
このアルゴリズムのポイントは以下の通りです。
- 配列の各要素について、「目標値 − 現在の数」=「ペアとなるべき数」を計算し、オブジェクトに記録します。
- それ以降の要素が、すでに記録済みの数と一致した時点で、目的のペアが見つかったことになります。
- この例では、
50を処理した時点で80 − 50 = 30が記録され、続く30に到達した瞬間にペア{50, 30}が返されます。
ループを完了してもペアが見つからなかった場合は false を返します。計算量・空間計算量ともに O(n) であり、ネストしたループで全組み合わせを調べる O(n²) の方法よりも大幅に高速です。大きな配列を扱う場合に特に有効な手法といえます。
-
C++で解く:配列全体とのXOR和が指定した数kになる値を求める方法
問題の概要本記事では、与えられた配列とある数とのXOR(排他的論理和)の合計が、指定された数kと等しくなるような「その数」を求める問題を解説します。まず、具体的な例を見てみましょう。入力: arr[] = {1, 2, 3, 4, 5}, k = 10 出力: 11 説明: 1 ^ 2 ^ 3 ^ 4 ^ 5 ^ 11 = 10 入力: arr[] = {12, 23, 34, 56, 78}, k = 6 出力: 73このように、配列内のすべての要素と答えとなる数をXORした結果がkになる値を導き出すのが目的です。解法の鍵となるXORの性質この問題を効率的に解くには、XOR演算子が持つ重要
-
C++で配列の指定範囲とのXOR合計が最大となる数を見つける方法
この記事では、配列と複数のクエリが与えられる問題を解きます。各クエリでは区間(L, R)が指定され、その区間内の各要素とxとのXORの合計が最大になるような数xを見つける必要があります。具体例を見てみましょう。入力 : A = {20, 11, 18, 2, 13} 3つのクエリを (L, R) ペアとして与える 1 3 3 5 2 4 出力 : 2147483629 2147483645 2147483645この問題では、まず各ビット位置ごとに「1」が出現する回数の累積和(プレフィックスカウント)を求めておきます。事前に1の個数を計算していれば、クエリで指定された区間L〜Rに含まれる1の個数