JavaScriptで配列内の隣接する要素のペアのうち、合計が最小となるペアを見つける方法
はじめに
本記事では、数値の配列を受け取り、隣接する2つの要素で構成されるサブ配列のうち、その合計が配列内のすべての隣接ペアの中で最も小さいものを返すJavaScript関数の作成方法を解説します。
問題の概要
要件は以下の通りです。
- 引数として数値の配列を受け取ること
- 元の配列から隣接する2要素のペアを取り出し、その合計が他のすべての隣接ペアの合計よりも小さい場合に、そのペアを返すこと
- 配列の長さが2未満の場合は、ブール値
falseを返すこと
具体例
たとえば、次の入力配列を考えてみましょう。
const arr = [41, 44, -12, 13, -23, 1, 5, -4, 2, 2];
この配列において、ペア [-23, 1] の合計は -22 となり、これは配列内のどの隣接する2要素の合計よりも小さい値です。したがって、この関数は [-23, 1] を返す必要があります。
実装コード
この問題を解決するためのコードは以下の通りです。
const arr = [41, 44, -12, 13, -23, 1, 5, -4, 2, 2];
const leastSum = arr => {
if(arr.length <= 2){
return false;
};
const creds = arr.reduce((acc, val, ind) => {
let { smallest, startIndex } = acc;
const next = arr[ind+1] ;
if(!next){
return acc;
}
const sum = val + next;
if(sum < smallest){
startIndex = ind;
smallest = sum;
};
return { startIndex, smallest };
}, {
smallest: Infinity,
startIndex: -1
});
const { startIndex } = creds;
return [arr[startIndex], arr[startIndex + 1]];
};
console.log(leastSum(arr));
コンソール出力
上記のコードを実行すると、コンソールには以下の出力が表示されます。
[-23, 1]
コードの解説
この実装のポイントは以下の通りです。
- ガード句によるチェック: 配列の長さが2以下の場合は、隣接ペアを作れない(または意味がない)ため、即座に
falseを返します。 - reduce() メソッドによる走査:
Array.prototype.reduce()を使って配列を1回だけ走査します。各要素について、その次の要素(arr[ind + 1])との合計を計算します。末尾の要素には「次の要素」が存在しないため、その時点で累積結果をそのまま返して処理をスキップします。 - 最小値の追跡: 初期値として
smallestにInfinityを設定しているため、最初の比較で必ず更新されます。現在の合計がこれまでの最小値より小さければ、開始インデックス(startIndex)と最小値を更新します。 - 結果の返却: 走査が完了した後、記録された
startIndexを利用して、最小の合計を持つ隣接する2要素を配列として返します。
このアルゴリズムの時間計算量は O(n)、空間計算量は O(1) であり、配列を一度の走査で効率的に処理できる点が特徴です。
-
JavaScriptで配列要素を再配置!隣接する重複をなくす並べ替えアルゴリズム
問題 リテラル値からなる配列 arr を第一引数(唯一の引数)として受け取るJavaScriptの関数を作成します。この配列には、隣接して並んでいる重複した値がいくつか含まれています。 関数の役割は、隣り合う2つの要素が同じ値にならないように配列の要素を並べ替えることです。ただし、そのような並べ替えが少なくとも1つは存在することが保証されているものとします。関数は再配置後の配列を返します。 たとえば、関数への入力が次の場合を考えてみましょう。 const arr = [7, 7, 7, 8, 8, 8]; このとき、期待される出力は次のとおりです。 const output = [7, 8,
-
JavaScriptで2次元配列の要素を交互に加減算して合計を求める方法
問題の概要行数と列数が同じ m × n の2次元配列(数値の行列)を受け取り、次の式で表される合計値を計算して返すJavaScript関数を作成します。$\sum_{i=1}^m \sum_{j=1}^n (-1)^{i+j}a_{ij}$この式が意味するのは、各要素に対して「インデックス i + j の偶奇」に応じて符号を切り替えるということです。具体的には、(i + j) が偶数である要素は正の符号で加算し、奇数である要素は負の符号で減算します。チェス盤のように市松模様状にプラスとマイナスが交互に並ぶイメージです。計算イメージ0始まりのインデックスで考えると、左上の要素 (0, 0) は