JavaScriptで「要素の合計+インデックスの差」が最大となるペアを求める方法
問題
整数の配列 arr を唯一の引数として受け取る JavaScript 関数を作成します。
関数は、配列内のすべてのインデックスペアの中で (arr[i] + arr[j]) + (i − j) の値が最も大きくなるようなペア (i, j) を選び、その最大値を返す必要があります。
入力例
const arr = [8, 1, 5, 2, 6];
この場合、期待される出力は次のとおりです。
const output = 11;
出力の説明
i = 0、j = 2 を選んだ場合、計算は以下のようになります。
(8 + 5) + (0 - 2) = 11
これは、他のどのインデックスペアを選んでも達成できない最大値となっています。
解法のポイント
この式は次のように変形できます。
(arr[i] + i) + (arr[j] - j)
つまり、「より小さいインデックス側の arr[i] + i の最大値」を変数に記憶しながら配列を一度だけ走査し、各位置 j で「max(arr[i] + i) + arr[j] − j」を計算すれば答えが求まります。この方法なら、全ペアを調べる O(n²) の二重ループを避け、O(n) の時間計算量・O(1) の追加メモリで効率的に解くことができます。
コード例
const arr = [8, 1, 5, 2, 6];
const findMaximum = (arr = []) => {
let max = arr[0] + 0;
let res = -Infinity;
for(let i = 1; i < arr.length; i++){
res = Math.max(res, max + arr[i] - i);
max = Math.max(arr[i] + i, max);
};
return res;
};
console.log(findMaximum(arr));
出力
コンソールには次のように表示されます。
11
-
JavaScriptで偶数インデックスの要素の合計に最後の要素を掛けて求める方法
問題 整数の配列を受け取り、偶数番目のインデックスにある要素の合計に、最後のインデックスの要素を掛けた値を返すJavaScript関数を作成します。 例として、次の配列を考えてみましょう。 const arr = [4, 1, 6, 8, 3, 9]; この場合、期待される出力は次の通りです。 const output = 117; 計算の流れ 偶数インデックス(0, 2, 4)にある要素は「4, 6, 3」 それらの合計は「4 + 6 + 3 = 13」 最後のインデックスの要素は「9」 したがって「13 × 9 = 117」となります コード例 以下が実際のコードです。 a + b
-
JavaScriptで配列を分割したときの平均値の合計の最大値を求める方法
問題の概要 数値の配列 arr を第一引数に、数値 num(num は arr の長さ以下)を第二引数に受け取るJavaScript関数を作成します。 この関数の目的は、配列 arr を最大 num 個の「隣接する空でないグループ」に分割することです。分割の際、どの要素も取り残してはいけません。 そして、考えられるすべての分割方法の中から、各グループの平均値の合計が最大になるような分割を選び出し、その最大の合計値を返します。 例として、次の入力を考えてみましょう。 入力 const arr = [10, 2, 3, 4, 10]; const num = 3; 出力 const output