JavaScriptでソートすべき最短の部分配列の長さを求める方法
問題
数値の配列 arr を最初の(そして唯一の)引数として受け取るJavaScript関数を作成する必要があります。
この関数の目的は、ある連続した部分配列を見つけ、その部分配列だけを昇順にソートしたときに、配列全体が昇順にソートされた状態になるようにする、その部分配列の長さを求めることです。
例えば、関数への入力が以下の場合を考えてみましょう。
const arr = [3, 7, 5, 9, 11, 10, 16];
このとき、出力は次のようになります。
const output = 5;
出力の説明
[7, 5, 9, 11, 10] の部分配列だけをソートすると、配列全体が昇順に並び替えられるためです。
解決のアプローチ:ソート済み配列との比較
この問題を解く最もシンプルで直感的な方法は、元の配列のコピーを作成してソートし、元の配列と要素を順番に比較することです。
具体的な手順は以下の通りです。
- 元の配列をコピーし、昇順にソートした配列を作成します。
- 先頭から順に元の配列とソート済み配列を比較し、最初に値が異なる位置(start)を見つけます。
- 末尾から順に同様の比較を行い、最後に値が異なる位置(end)を見つけます。
- start から end までの要素数(end - start + 1)が答えとなります。配列がすでにソート済みの場合は 0 を返します。
コード例
以下が実際のコードです。
const arr = [3, 7, 5, 9, 11, 10, 16];
const shortestLength = (arr = []) => {
const sorted = [...arr].sort((a, b) => a - b)
let start = 0
let end = sorted.length - 1
while (sorted[start] === arr[start] && start < arr.length) {
start += 1
}
while (sorted[end] === arr[end] && end >= 0) {
end -= 1
}
return end >= start ? end - start + 1 : 0
}
console.log(shortestLength(arr));
出力
コンソールには以下が出力されます。
5
計算量について
このアプローチの時間計算量は O(n log n)(配列のソートに依存)、空間計算量は O(n)(配列のコピーが必要なため)です。配列がすでにソートされている場合でも、whileループによる走査は O(n) で完了するため、全体として効率的な解法と言えます。
-
JavaScriptの配列lengthプロパティとは?使い方とサンプルコードを解説
JavaScriptのlengthプロパティは、配列に格納されている要素の総数(配列の長さ)を取得したり、設定したりできる便利なプロパティです。配列操作において最もよく使われるプロパティの一つであり、ループ処理や条件分岐など、さまざまな場面で活用されます。 lengthプロパティの基本 lengthプロパティは、以下のような特徴を持っています。 配列内の要素数を数値として返す 値を代入することで配列の長さを変更できる(短くすると要素が削除される) インデックスは0から始まるため、最後の要素のインデックスは「length - 1」になる サンプルコード 以下は、lengthプロパティを使って
-
JavaScriptのlengthプロパティで配列オブジェクトの長さを取得する方法
JavaScriptにおけるlengthプロパティとはJavaScriptのlengthプロパティは、文字列や配列などのオブジェクトが持つ要素数(サイズ)を返すために使用されます。配列の場合は格納されている要素の個数、文字列の場合は文字数を取得できます。ここでは、文字列と配列オブジェクトの長さをlengthプロパティで取得するサンプルコードを紹介します。サンプルコード以下の例では、ボタンをクリックすると配列の長さが画面に表示される仕組みを実装しています。<!DOCTYPE html> <html lang="ja"> <head> <