JavaScript を使用した DSA での配列操作のマスター: 基本から上級まで

王林
リリース: 2024-09-06 18:30:35
オリジナル
1070 人が閲覧しました

Mastering Array Manipulation in DSA using JavaScript: From Basics to Advanced

DSA 用の JavaScript での配列操作をマスターする

配列はコンピューターサイエンスにおける基本的なデータ構造であり、さまざまなアルゴリズムや問題解決シナリオで広く使用されています。この包括的なガイドでは、基本レベルから高度なレベルまでのトピックをカバーし、JavaScript での配列操作の基本を説明します。走査、挿入、削除、検索などを、時間計算量や実際の例とともに説明します。

目次

  1. 配列の概要
  2. 配列トラバーサル
  3. 配列への挿入
  4. 配列内の削除
  5. 配列内の検索
  6. 高度な配列操作テクニック
  7. 練習問題
  8. LeetCode の問題リンク

1. 配列の概要

配列は、連続したメモリ位置に格納される要素のコレクションです。 JavaScript では、配列は動的であり、さまざまな型の要素を保持できます。

基本的な配列操作:

// Creating an array
let arr = [1, 2, 3, 4, 5];

// Accessing elements
console.log(arr[0]); // Output: 1

// Modifying elements
arr[2] = 10;
console.log(arr); // Output: [1, 2, 10, 4, 5]

// Getting array length
console.log(arr.length); // Output: 5
ログイン後にコピー

時間計算量:

  • 要素へのアクセス: O(1)
  • 要素の変更: O(1)
  • 配列の長さの取得: O(1)

2. 配列トラバーサル

トラバーサルとは、配列の各要素を 1 回ずつ訪問することを意味します。 JavaScript で配列を走査するにはいくつかの方法があります。

2.1 for ループの使用

let arr = [1, 2, 3, 4, 5];
for (let i = 0; i < arr.length; i++) {
    console.log(arr[i]);
}
ログイン後にコピー

時間計算量: O(n)、n は配列内の要素の数です。

2.2 forEachの使用

let arr = [1, 2, 3, 4, 5];
arr.forEach(element => console.log(element));
ログイン後にコピー

時間計算量: O(n)

2.3 for...of ループの使用

let arr = [1, 2, 3, 4, 5];
for (let element of arr) {
    console.log(element);
}
ログイン後にコピー

時間計算量: O(n)

3. 配列への挿入

配列への挿入は、先頭、末尾、または特定の位置で行うことができます。

3.1 最後に挿入

let arr = [1, 2, 3];
arr.push(4);
console.log(arr); // Output: [1, 2, 3, 4]
ログイン後にコピー

時間計算量: O(1) (償却)

3.2 先頭への挿入

let arr = [1, 2, 3];
arr.unshift(0);
console.log(arr); // Output: [0, 1, 2, 3]
ログイン後にコピー

時間計算量: O(n)、既存のすべての要素をシフトする必要があるため

3.3 特定の位置への挿入

let arr = [1, 2, 4, 5];
arr.splice(2, 0, 3);
console.log(arr); // Output: [1, 2, 3, 4, 5]
ログイン後にコピー

時間計算量: O(n)、挿入ポイントの後の要素をシフトする必要があるため

4. 配列内の削除

挿入と同様に、削除も先頭、末尾、または特定の位置で実行できます。

4.1 末尾からの削除

let arr = [1, 2, 3, 4];
arr.pop();
console.log(arr); // Output: [1, 2, 3]
ログイン後にコピー

時間計算量: O(1)

4.2 先頭から削除

let arr = [1, 2, 3, 4];
arr.shift();
console.log(arr); // Output: [2, 3, 4]
ログイン後にコピー

時間計算量: O(n)、残りの要素はすべてシフトする必要があるため

4.3 特定の位置の削除

let arr = [1, 2, 3, 4, 5];
arr.splice(2, 1);
console.log(arr); // Output: [1, 2, 4, 5]
ログイン後にコピー

時間計算量: O(n)、削除ポイント以降の要素をシフトする必要があるため

5. 配列内の検索

検索は配列に対して実行される一般的な操作です。いくつかの検索テクニックを見てみましょう。

5.1 線形探索

function linearSearch(arr, target) {
    for (let i = 0; i < arr.length; i++) {
        if (arr[i] === target) return i;
    }
    return -1;
}

let arr = [1, 3, 5, 7, 9];
console.log(linearSearch(arr, 5)); // Output: 2
console.log(linearSearch(arr, 6)); // Output: -1
ログイン後にコピー

時間計算量: O(n)

5.2 二分探索 (ソートされた配列の場合)

function binarySearch(arr, target) {
    let left = 0, right = arr.length - 1;
    while (left <= right) {
        let mid = Math.floor((left + right) / 2);
        if (arr[mid] === target) return mid;
        if (arr[mid] < target) left = mid + 1;
        else right = mid - 1;
    }
    return -1;
}

let arr = [1, 3, 5, 7, 9];
console.log(binarySearch(arr, 5)); // Output: 2
console.log(binarySearch(arr, 6)); // Output: -1
ログイン後にコピー

時間計算量: O(log n)

6. 高度な配列操作テクニック

次に、配列操作のためのより高度なテクニックをいくつか見てみましょう。

6.1 ツーポインタ技術

2 ポインター手法は、配列の問題を効率的に解決するためによく使用されます。次に、2 つのポインターを使用して配列をその場で反転する例を示します。

function reverseArray(arr) {
    let left = 0, right = arr.length - 1;
    while (left < right) {
        [arr[left], arr[right]] = [arr[right], arr[left]];
        left++;
        right--;
    }
}

let arr = [1, 2, 3, 4, 5];
reverseArray(arr);
console.log(arr); // Output: [5, 4, 3, 2, 1]
ログイン後にコピー

時間計算量: O(n)

6.2 スライディング ウィンドウ手法

スライディング ウィンドウ手法は、部分配列の問題を解決するのに役立ちます。サイズ k の最大合計部分配列を見つける例を次に示します:

function maxSumSubarray(arr, k) {
    let maxSum = 0;
    let windowSum = 0;

    // Calculate sum of first window
    for (let i = 0; i < k; i++) {
        windowSum += arr[i];
    }
    maxSum = windowSum;

    // Slide the window
    for (let i = k; i < arr.length; i++) {
        windowSum = windowSum - arr[i - k] + arr[i];
        maxSum = Math.max(maxSum, windowSum);
    }

    return maxSum;
}

let arr = [1, 4, 2, 10, 23, 3, 1, 0, 20];
console.log(maxSumSubarray(arr, 4)); // Output: 39
ログイン後にコピー

時間計算量: O(n)

6.3 カダネのアルゴリズム

Kadane のアルゴリズムは、配列内の最大部分配列合計を見つけるために使用されます。これは動的プログラミングの例です:

function kadane(arr) {
    let maxSoFar = arr[0];
    let maxEndingHere = arr[0];

    for (let i = 1; i < arr.length; i++) {
        maxEndingHere = Math.max(arr[i], maxEndingHere + arr[i]);
        maxSoFar = Math.max(maxSoFar, maxEndingHere);
    }

    return maxSoFar;
}

let arr = [-2, -3, 4, -1, -2, 1, 5, -3];
console.log(kadane(arr)); // Output: 7
ログイン後にコピー

時間計算量: O(n)

6.4 オランダ国旗アルゴリズム

このアルゴリズムは、0、1、2 のみを含む配列をソートするために使用されます:

function dutchNationalFlag(arr) {
    let low = 0, mid = 0, high = arr.length - 1;

    while (mid <= high) {
        if (arr[mid] === 0) {
            [arr[low], arr[mid]] = [arr[mid], arr[low]];
            low++;
            mid++;
        } else if (arr[mid] === 1) {
            mid++;
        } else {
            [arr[mid], arr[high]] = [arr[high], arr[mid]];
            high--;
        }
    }
}

let arr = [2, 0, 1, 2, 1, 0];
dutchNationalFlag(arr);
console.log(arr); // Output: [0, 0, 1, 1, 2, 2]
ログイン後にコピー

時間計算量: O(n)

7. 練習問題

簡単なレベルから上級レベルまでの練習問題を 50 問紹介します。これらの一部は LeetCode からのものですが、その他は一般的な配列操作シナリオです:

  1. 配列内のすべての要素を合計する
  2. 配列内の最大要素を検索します
  3. 配列をその場で反転します
  4. 並べ替えられた配列から重複を削除します
  5. 配列を k ステップ回転します
  6. 配列内で 2 番目に大きい要素を検索します
  7. ソートされた 2 つの配列をマージします
  8. 1 から n までの配列で欠落している番号を見つけます
  9. すべてのゼロを配列の末尾に移動します
  10. 2 つの配列の共通部分を見つけます
  11. 2 つの配列の和集合を見つけます
  12. 配列が別の配列のサブセットであるかどうかを確認します
  13. 配列内の均衡インデックスを見つけます
  14. 配列内の正の数値と負の数値を並べ替えます
  15. 配列内の多数要素を検索します
  16. 配列内のピーク要素を検索します
  17. 循環配列を実装する
  18. 配列内の最小の正の欠損数を検索します
  19. 雨水の滞留問題
  20. 配列を使用してスタックを実装する
  21. 配列を使用してキューを実装する
  22. 最長の増加サブシーケンスを検索します
  23. 回転ソート配列で二分探索を実装します
  24. サイズ k の部分配列の最大合計を求めます
  25. Kadane のアルゴリズムを実装する
  26. 鉄道駅に必要なプラットフォームの最小数を求めます
  27. 同じ数の 0 と 1 を持つ最長の部分配列を見つけます
  28. オランダ国旗アルゴリズムを実装する
  29. 指定された値よりも大きい合計を持つ最小の部分配列を検索します
  30. Boyer-Moore 多数決投票アルゴリズムを実装する
  31. 最大の積部分配列を見つける
  32. ジャンプ ゲーム アルゴリズムを実装する
  33. 配列内のすべての要素に対して次に大きい要素を検索します
  34. スライディング ウィンドウ最大アルゴリズムを実装する
  35. 文字を繰り返さない最長の部分文字列を検索します
  36. マージ間隔アルゴリズムを実装する
  37. 配列の最後に到達するための最小ジャンプ数を見つけます
  38. 利益を最大化するための株式購入売却アルゴリズムを実装します
  39. 最長の回文部分文字列を検索します
  40. 最長共通部分列アルゴリズムを実装する
  41. ソートされていない最短の連続部分配列を検索します
  42. 水が最も多いコンテナアルゴリズムを実装する
  43. 配列内の最長の連続シーケンスを検索します
  44. 3 つの数値の最大積アルゴリズムを実装する
  45. 配列内の K 番目に大きい要素を検索します
  46. 配列内のすべての重複を検索アルゴリズムを実装します
  47. 最小サイズのサブ配列の合計を見つけます
  48. 自己を除く配列の積アルゴリズムを実装します
  49. ソートされた配列内の最大ギャップを見つける
  50. 2 つの並べ替えられた配列の中央値アルゴリズムを実装する

8. LeetCodeの問題のリンク

配列操作スキルをテストするための LeetCode の問題 20 問を紹介します:

  1. 2つの合計
  2. 株式を売買するのに最適な時期
  3. 重複が含まれています
  4. 自己を除く配列の積
  5. 最大サブ配列
  6. マージ間隔
  7. 3合計
  8. ほとんどの水が入った容器
  9. 配列を回転
  10. 回転ソート配列で検索
  11. 回転ソートされた配列の最小値を見つける
  12. 次の順列
  13. サブ配列の合計は K に等しい
  14. スパイラルマトリックス
  15. ジャンプゲーム
  16. 最長連続シーケンス
  17. 配列内のすべての重複を検索
  18. 配列内の K 番目に大きい要素
  19. 雨水を溜める
  20. ソートされた 2 つの配列の中央値

これらの問題に取り組み、基礎となる概念を理解することで、JavaScript でのデータ構造とアルゴリズムの配列操作スキルが大幅に向上します。

これらのテクニックを習得するための鍵は、一貫した練習と、ソリューションの時間と空間の複雑さを理解することであることに注意してください。

コーディングを楽しんでください!

以上がJavaScript を使用した DSA での配列操作のマスター: 基本から上級までの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート