数组是计算机科学中的基本数据结构,广泛应用于各种算法和问题解决场景中。这份综合指南将带您了解 JavaScript 中数组操作的基础知识,涵盖从基础到高级的主题。我们将探索遍历、插入、删除、搜索等,以及它们的时间复杂度和实际示例。
数组是存储在连续内存位置的元素的集合。在 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
时间复杂度:
遍历意味着访问数组的每个元素一次。在 JavaScript 中,有多种方法可以遍历数组。
let arr = [1, 2, 3, 4, 5]; for (let i = 0; i < arr.length; i++) { console.log(arr[i]); }
时间复杂度:O(n),其中 n 是数组中元素的数量。
let arr = [1, 2, 3, 4, 5]; arr.forEach(element => console.log(element));
时间复杂度:O(n)
let arr = [1, 2, 3, 4, 5]; for (let element of arr) { console.log(element); }
时间复杂度:O(n)
可以在数组的开头、结尾或特定位置插入。
let arr = [1, 2, 3]; arr.push(4); console.log(arr); // Output: [1, 2, 3, 4]
时间复杂度:O(1)(摊销)
let arr = [1, 2, 3]; arr.unshift(0); console.log(arr); // Output: [0, 1, 2, 3]
时间复杂度:O(n),因为所有现有元素都需要移动
let arr = [1, 2, 4, 5]; arr.splice(2, 0, 3); console.log(arr); // Output: [1, 2, 3, 4, 5]
时间复杂度:O(n),因为插入点之后的元素需要移动
与插入类似,删除可以在开头、结尾或特定位置进行。
let arr = [1, 2, 3, 4]; arr.pop(); console.log(arr); // Output: [1, 2, 3]
时间复杂度:O(1)
let arr = [1, 2, 3, 4]; arr.shift(); console.log(arr); // Output: [2, 3, 4]
时间复杂度:O(n),因为所有剩余元素都需要移位
let arr = [1, 2, 3, 4, 5]; arr.splice(2, 1); console.log(arr); // Output: [1, 2, 4, 5]
时间复杂度:O(n),因为删除点之后的元素需要移位
搜索是对数组执行的常见操作。让我们看看一些搜索技巧。
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)
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)
现在让我们探索一些更高级的数组操作技术。
两指针技术经常被用来有效地解决数组问题。这是使用两个指针就地反转数组的示例:
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)
滑动窗口技术对于解决子数组问题很有用。下面是一个查找大小为 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)
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)
该算法用于对仅包含 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)
这里有 50 个练习题,从简单到高级。其中一些来自 LeetCode,而另一些则是常见的数组操作场景:
Here are 20 LeetCode problems to test your array manipulation skills:
By working through these problems and understanding the underlying concepts, you'll significantly improve your array manipulation skills in JavaScript for Data Structures and Algorithms.
Remember, the key to mastering these techniques is consistent practice and understanding the time and space complexities of your solutions.
Happy coding!
以上是使用 JavaScript 掌握 DSA 中的数组操作:从基础到高级的详细内容。更多信息请关注PHP中文网其他相关文章!