JavaScript
 Computer >> コンピューター >  >> プログラミング >> JavaScript

【JavaScript】配列の中で左右の合計が等しくなる中央インデックス(ピボットインデックス)を見つける方法

問題

数値の配列 arr が与えられたとき、「あるインデックスより左側にあるすべての要素の合計」と「そのインデックスより右側にあるすべての要素の合計」が等しくなる位置(中央インデックス/ピボットインデックス)を求める JavaScript 関数を作成します。

該当するインデックスが複数存在する場合は、最初に見つかったものを返し、存在しない場合は -1 を返すのが一般的です。

たとえば、次のような入力を考えます。

入力

const arr = [1, 7, 3, 6, 5, 6];

出力

const output = 3;

出力の解説

インデックス 3 の要素は nums[3] = 6 です。この要素の左側にある数値(1 + 7 + 3 = 11)の合計は、右側にある数値(5 + 6 = 11)の合計と等しくなります。

また、インデックス 3 はこの条件を満たす最初の位置であるため、答えは 3 となります。

アルゴリズムの考え方

毎回左右の合計を個別に計算すると非効率ですが、次の手順で一度の走査(O(n))で求められます。

  1. まず reduce() を使って配列全体の合計値 sum を求めます。
  2. 配列を先頭から順に走査し、現在のインデックスより左側の合計 currentSum を累積していきます。
  3. 各ステップで sum から現在の要素を差し引き、これを「右側の残りの合計」として更新します。
  4. currentSum === sum となった時点のインデックスを返します。
  5. 最後まで条件を満たすインデックスがなければ -1 を返します。

コード例

以下が実際のコードです。

const arr = [1, 7, 3, 6, 5, 6];
const medianIndex = (arr = []) => {
    let sum = arr.reduce((acc, num) => acc + num, 0)
    let currentSum = 0
    for (let i = 0; i < arr.length; i++) {
        currentSum += (arr[i - 1] || 0)
        sum -= arr[i]
        if (currentSum === sum) {
            return i
        }
    }
    return -1
}
console.log(medianIndex(arr));

実行結果

3

このように、全体の合計を先に求めておき、左側の累積和との比較だけで判定することで、余分な計算を省いた効率的な実装になります。

  1. JavaScriptの基本配列メソッド解説!push・pop・shift・unshift・spliceの使い方を実例付きで紹介

    JavaScriptには、配列を操作するための便利な組み込みメソッドが数多く用意されています。その中でも特によく使われるのが、要素の追加や削除を行う以下の5つの基本メソッドです。 JavaScriptの主要な配列メソッド一覧 メソッド説明 Array.push()配列の末尾に要素を追加します。 Array.pop()配列の末尾から要素を取り除きます。 Array.unshift()配列の先頭に要素を追加します。 Array.shift()配列の先頭から要素を取り除きます。 Array.splice()配列内の任意の位置で要素の追加・削除を行います。 これらのメソッドは、配列の

  2. JavaScriptで配列の中央値を計算する方法をわかりやすく解説

    中央値(メジアン)とは、数値データを小さい順に並べたときにちょうど中央に位置する値のことです。JavaScriptで配列の中央値を求めるには、まず配列をソートし、その後要素数に応じて処理を分けます。要素数が奇数の場合は中央の1つの要素を、偶数の場合は中央に近い2つの要素の平均値を中央値として返します。中央値の計算手順配列をソートする - 数値配列の場合、sort() メソッドに比較関数 (a, b) => a - b を渡して正しく昇順ソートします。中央のインデックスを求める - Math.floor(arr.length / 2) で中央位置を整数として取得します。要素数の判定を行う