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

合計が数値に等しいすべてのサブ配列を検索しますか? JavaScript(スライディングウィンドウアルゴリズム)


数字の配列と数字が与えられます。私たちの仕事は、2番目の引数として指定された数に加算されるすべてのサブ配列の配列を返す関数を作成することです。

例-

const arr = [23, 5, 1, 34, 12, 67, 9, 31, 6, 7, 27];
const sum = 40;
console.log(requiredSum(arr, sum));
>

次の配列を出力する必要があります-

[ [ 5, 1, 34 ], [ 9, 31 ], [ 6, 7, 27 ] ]

これらの3つのサブアレイのそれぞれが合計40になるためです。

スライディングウィンドウアルゴリズム(線形時間)

このアルゴリズムは主に、特定の条件を満たす文字列内の配列/サブ文字列内のサブ配列を検索する必要がある場合に使用されます。そして、この問題は、スライディングウィンドウアルゴリズムの完璧な候補です。

スライディングウィンドウアルゴリズムは、その名前が示すとおりです。元の配列のサブ配列にすぎないウィンドウを作成します。このウィンドウは、増減することで安定性を獲得しようとします。

安定性とは、問題で指定された条件を意味します(ここで特定の数を合計するなど)。安定したら、ウィンドウを記録してスライドを続けます。一般に、問題の90%で、ウィンドウを左から開始し、配列/文字列の最後に到達するまでスライドし続けます。

スライディングウィンドウアルゴリズムに慣れるためのコードを見てみましょう。

const arr = [23, 5, 1, 34, 12, 67, 9, 31, 6, 7, 27];
const sum = 40;
const findSub = (arr, sum) => {
   const required = [];
   for(let start = 0, end = 0, s = 0; end <= arr.length || s > sum ; ){
      if(s < sum){
         s += arr[end];
         end++;
      }else if(s > sum){
         s -= arr[start];
         start++;
      }else{
         required.push(arr.slice(start, end));
         s -= arr[start];
         s += arr[end];
         start++;
         end++;
      };
   };
   return required;
};
console.log(findSub(arr, sum));

開始変数と終了変数は、さまざまなポイントでのウィンドウの開始位置と終了位置を示します。

最初は両方とも0から開始し、必要な合計が指定された合計よりも小さい場合はウィンドウのサイズを増やし、大きい場合はウィンドウサイズを減らし、いずれかの時点で両方の合計が等しい場合は、そのサブ配列を必要な配列にプッシュしました。そして、ウィンドウを単位距離だけ右に移動しました。

出力

コンソールでのこのコードの出力は-

になります
[ [ 5, 1, 34 ], [ 9, 31 ], [ 6, 7, 27 ] ]

  1. C++で合計が0のすべてのサブ配列を出力します

    この問題では、整数値の配列が与えられ、合計が0に等しいこの配列からすべてのサブ配列を出力する必要があります。 トピックをよりよく理解するために例を見てみましょう Input: array = [-5, 0, 2, 3, -3, 4, -1] Output: Subarray with sum 0 is from 1 to 4. Subarray with sum 0 is from 5 to 7 Subarray with sum 0 is from 0 to 7 この問題を解決するために、可能なすべてのサブアレイをチェックします。そして、これらのサブ配列の合計が0に等しいかどうかを確認し

  2. Pythonで最小の操作数で等和配列を見つけるプログラム

    nums1とnums2という名前の2つの配列があるとします。配列の値は1から6(両端を含む)です。 1つの操作で、任意の配列の任意の値を1〜6の任意の値に更新できます。nums1の値の合計をnums2の値の合計と等しくするために必要な操作の最小数を見つける必要があります。不可能な場合は-1を返す必要があります。 したがって、入力がnums1 =[1,5,6]、nums2 =[4,1,1]の場合、nums2を[4,1,1]から[4、最初の操作では1,6]、2番目の操作では[4,2,6]で、同じものをnums1に等しくします。 これを解決するには、次の手順に従います- s1:=nums1