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

JavaScriptで配列の部分和(累積和)を求める方法

本記事では、数値の配列(ネストされた配列)を受け取り、各サブ配列ごとに「部分和」の配列を作成するJavaScript関数の実装方法を解説します。

部分和(累積和)とは、配列内の各要素が「その要素自身と、それ以前のすべての要素の合計」になるように計算した配列のことです。

処理内容の例

たとえば、入力配列が以下の場合を考えてみましょう。

const arr = [
  [1, 1, 1, -1],
  [1, -1, -1],
  [1, 1]
];

この場合、期待される出力は次のようになります。

const output = [
  [1, 2, 3, 2],
  [1, 0, -1],
  [1, 2]
];

計算の流れ

最初のサブ配列 [1, 1, 1, -1] を例にすると、部分和は以下のように求められます。

  • 1番目の要素: 1
  • 2番目の要素: 1 + 1 = 2
  • 3番目の要素: 1 + 1 + 1 = 3
  • 4番目の要素: 1 + 1 + 1 + (-1) = 2

実装コード

以下が、実際のJavaScriptコードです。forEach を二重に使い、外側で各サブ配列を、内側で各要素を順番に処理していきます。

const arr = [[1, 1, 1, -1], [1, -1, -1], [1, 1]];

const partialSum = (arr = []) => {
  const res = [];
  arr.forEach(sub => {
    // 累積値を保持する変数
    let accu = 0;
    const nestedArr = [];
    sub.forEach(n => {
      // 現在の要素を加算して累積和を作る
      accu += n;
      nestedArr.push(accu);
    });
    res.push(nestedArr);
  });
  return res;
};

console.log(partialSum(arr));

コードのポイント

  • accu変数: 各サブ配列の先頭で0に初期化され、要素を順に足し込んでいくことで累積和を実現します。
  • nestedArr配列: 各時点での累積値を格納し、サブ配列単位の部分和配列を構築します。
  • res配列: 完成した各サブ配列の部分和をまとめて返却用に保持します。

実行結果

上記のコードをコンソールで実行すると、出力は次のようになります。

[ [ 1, 2, 3, 2 ], [ 1, 0, -1 ], [ 1, 2 ] ]

このように、シンプルなループ処理だけで、ネストされた配列の部分和を効率的に計算できます。累積和の考え方は、区間和の高速化などさまざまなアルゴリズム問題にも応用できるため、ぜひマスターしておきましょう。

  1. JavaScriptでネストされた配列の加重和を計算する方法

    ```html 問題 任意の深さまでネストされた配列 arr を唯一の引数として受け取り、その加重和(weighted sum)を計算して返す JavaScript 関数を作成する必要があります。 加重和とは、各要素に「その要素が属するネストの深さ(レベル)」を掛けた値を、配列全体にわたって合計したものです。 入力例と出力例 たとえば、関数に次の配列を渡した場合を考えてみましょう。 const arr = [4, 7, [6, 1, [5, 2]]]; このとき、期待される出力は次のとおりです。 const output = 46; なぜ 46 になるのか? 最上位の要素はレベル1、その中

  2. 【JavaScript】配列の部分和(後方からの累積和)を求める方法を解説

    問題 数値の配列を受け取り、新しい配列を構築して返すJavaScript関数を作成します。戻り値となる配列の各要素には、元の配列において「その位置より右側にあるすべての要素(自分自身を含む)」の合計が格納されます。 コード例 以下が実際のコードです。 const arr = [5, 6, 1, 3, 8, 11]; const partialSum = (arr = []) => { let sum = arr.reduce((acc, val) => acc + val); const res = []; let x = 0; if(arr.le