首頁 > web前端 > js教程 > 主體

使用 JavaScript 掌握 DSA 中的陣列操作:從基礎到高級

王林
發布: 2024-09-06 18:30:35
原創
1082 人瀏覽過

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. 數組遍歷

遍歷意味著存取陣列的每個元素一次。在 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 兩指針技術

兩指針技術經常被用來有效地解決數組問題。這是使用兩個指標就地反轉數組的範例:

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算法

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. 找出陣列中第二大的元素
  7. 合併兩個排序數組
  8. 在 1 到 n 的陣列中找出缺少的數字
  9. 將所有零移至數組結尾
  10. 求兩個陣列的交集
  11. 求兩個陣列的並集
  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. 實作三數最大乘積演算法
  45. 找出陣列中第 K 個最大的元素
  46. 實作查找數組中的所有重複項演算法
  47. 求最小子數組和
  48. 實現除自身之外的陣列的乘積演算法
  49. 找出排序數組中的最大間隙
  50. 實作兩個排序數組的中位數演算法

8.LeetCode問題鏈接

這裡有 20 道 LeetCode 問題來測試你的陣列操作技能:

  1. 兩和
  2. 買賣股票的最佳時機
  3. 包含重複
  4. 除自身之外的陣列的乘積
  5. 最大子數組
  6. 合併間隔
  7. 3Sum
  8. 裝最多水的容器
  9. 旋轉數組
  10. 在旋轉排序數組中搜尋
  11. 找出旋轉排序數組中的最小值
  12. 下一個排列
  13. 子數組和等於 K
  14. 螺旋矩陣
  15. 跳躍遊戲
  16. 最長連續序列
  17. 找出數組中的所有重複項
  18. 陣列中的第 K 個最大元素
  19. 收集雨水
  20. 兩個排序數組的中位數

透過解決這些問題並理解基本概念,您將顯著提高 JavaScript 中資料結構和演算法的陣列操作技能。

請記住,掌握這些技術的關鍵是持續練習並理解解決方案的時間和空間複雜性。

編碼愉快!

以上是使用 JavaScript 掌握 DSA 中的陣列操作:從基礎到高級的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板