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

JavaScriptで合計が0になる部分配列が存在するかどうかを判定する方法

正と負の値が混在する数値の配列を受け取り、元の配列の中に合計が0になる部分配列(サブ配列)が存在するかどうかを判定するJavaScript関数を作成する必要があります。

関数は、その判定結果に基づいてブール値(true または false)を返す必要があります。

アプローチ

この問題のアプローチはシンプルです。forループを使って配列を先頭から走査しながら、その要素までの累積和を計算していきます。走査の途中で累積和が0になった場合、あるいは以前に同じ値の累積和が出現した場合は、合計が0になる部分配列が存在することを意味します。逆に、配列の最後までそのような状況が一度も発生しなければ、合計が0になる部分配列は存在しないと判定できます。

累積和が同じ値に戻るということは、その間に加算された要素の合計が0であることを示しているためです。この性質を利用することで、効率的に判定を行えます。

それでは、この関数のコードを見てみましょう。

コード例

const arr = [4, 2, -1, 5, -2, -1, -2, -1, 4, -1, 5, -2, 3];
const zeroSum = arr => {
    const map = new Map();
    let sum = 0;
    for(let i = 0; i < arr.length; i++){
        sum += arr[i];
        if(sum === 0 || map.get(sum)){
            return true;
        };
        map.set(sum, i);
    };
    return false;
};
console.log(zeroSum(arr));

このコードでは、Map オブジェクトを使ってこれまでに出現した累積和を記録しています。各要素を加算した後、累積和が0であるか、すでにMapに登録済みの値と一致するかを確認し、該当すれば即座に true を返します。

出力

コンソールへの出力結果は次のとおりです。

true

この例の配列では、たとえば [2, -1, 5, -2, -1, -2, -1] のように合計が0になる部分配列が存在するため、関数は true を返します。このアルゴリズムの計算量はO(n)であり、すべての部分配列を総当たりで調べるO(n²)の方法と比べて大幅に効率的です。

  1. JavaScriptで配列の要素を同じ配列内に複製する方法

    JavaScriptでは、concat()メソッドとsort()メソッドを組み合わせることで、既存の配列の要素を同じ配列内に複製することができます。ここでは、実際に動作するサンプルコードを使って、その手順をわかりやすく解説します。 コード例 以下は、配列の要素を同じ配列内に複製するためのコード例です。 <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8" /> <meta name="viewport" cont

  2. 【JavaScript】ユーザーが入力した文字列が配列に含まれているかチェックする方法

    本記事では、ユーザーに文字列を入力してもらうための入力欄を備えたJavaScriptプログラムを作成します。 プログラムは、入力された値が、あらかじめコード内で定義しておいた配列の要素と一致するかどうかを判定します。入力された文字列が配列内に存在すれば画面に「true」を、存在しなければ「false」を表示します。 実装例 この動作を実現するコードは以下のとおりです。 <!DOCTYPE html> <html> <head>     <meta charset="utf-8"> &nb