JavaScriptでarr[i] <= arr[j]を満たす最大のインデックス差(j - i)を求める方法
問題
数値の配列 arr を受け取るJavaScript関数を作成します。この関数は、arr[i] <= arr[j] を満たす組み合わせの中から、j - i の差が最も大きくなる値を返す必要があります。
つまり、「前方の要素が後方の要素以下である」という条件を満たす、2つのインデックス間の最大距離を求めるという問題です。
解決アプローチ
最もシンプルな方法は、ネストされたループを使ってすべてのインデックスのペア (i, j) を調べることです。各ペアについて arr[i] <= arr[j] が成立するかどうかを確認し、その差 j - i が現在の結果より大きければ更新していきます。
コード例
実装コードは以下のとおりです。
const arr = [1, 2, 3, 4];
const findLargestDifference = (arr = []) => {
const { length: len } = arr;
let res = 0;
for(let i = 0; i < len; i++){
for(let j = i + 1; j < len; j++){
if(arr[i] <= arr[j] && (j - i) > res){
res = j - i;
};
};
};
return res;
};
console.log(findLargestDifference(arr));
出力結果
コンソールには次のように出力されます。
3
処理の解説
この例では、配列 [1, 2, 3, 4] は昇順に並んでいるため、任意の i < j について arr[i] <= arr[j] が常に成り立ちます。したがって、最大の差は最初のインデックス 0 と最後のインデックス 3 の組み合わせとなり、結果は 3 になります。
なお、この二重ループによるアプローチの計算量は O(n²) です。配列サイズが大きい場合には、単調減少スタックなどを活用した O(n) の効率的なアルゴリズムを検討するとよいでしょう。
-
JavaScriptで左右の合計が等しくなる「バランスインデックス」を配列から見つける方法
問題 整数の配列 arr を唯一の引数として受け取る JavaScript 関数を作成する必要があります。 この関数は、指定したインデックスの左側にある要素の合計と右側にある要素の合計が等しくなるようなインデックスを1つ見つけて返します。該当するインデックスが配列内に存在しない場合は、-1 を返します。 たとえば、関数への入力が次の場合を考えてみましょう。 入力 const arr = [1, 2, 3, 4, 3, 2, 1]; 出力 const output = 3; 出力の説明 インデックス 3 の左側(1 + 2 + 3 = 6)と右側(3 + 2 + 1 = 6)の要素の合計が、どち
-
【JavaScript】配列の中で左右の合計が等しくなる中央インデックス(ピボットインデックス)を見つける方法
問題数値の配列 arr が与えられたとき、「あるインデックスより左側にあるすべての要素の合計」と「そのインデックスより右側にあるすべての要素の合計」が等しくなる位置(中央インデックス/ピボットインデックス)を求める JavaScript 関数を作成します。該当するインデックスが複数存在する場合は、最初に見つかったものを返し、存在しない場合は -1 を返すのが一般的です。たとえば、次のような入力を考えます。入力const arr = [1, 7, 3, 6, 5, 6];出力const output = 3;出力の解説インデックス 3 の要素は nums[3] = 6 です。この要素の左側にある