删除有序数组中的重复项:LeetCode 数组实战(javascript)
2023-12-03 09:18:26
引言
LeetCode是一家专注于编程练习和面试准备的在线平台,它拥有大量编程题目和丰富的学习资源,受到众多程序员的青睐。数组是LeetCode中常见的题目类型,也是程序员在实际工作中经常遇到的数据结构。本文将带领你探索LeetCode数组问题——“删除有序数组中的重复项”,并为你提供四种不同解法的详细解析。
解法1:基础双指针法
这种方法使用两个指针,一个指针指向当前正在处理的元素,另一个指针指向结果数组中的最后一个元素。当遇到重复元素时,我们只需将结果数组指针指向当前指针,并将当前指针指向下一个元素。这种方法简单易懂,但效率较低,因为它需要遍历整个数组两次。
代码示例:
function removeDuplicates(nums) {
if (nums.length === 0) {
return 0;
}
let i = 0;
let j = 0;
while (i < nums.length) {
if (nums[i] !== nums[j]) {
nums[++j] = nums[i];
}
i++;
}
return j + 1;
}
时间复杂度: O(n)
空间复杂度: O(1)
解法2:优化双指针法
这种方法与解法1类似,但它使用了一个额外的变量来记录上一次遇到的元素。当遇到重复元素时,我们只需跳过该元素,继续处理下一个元素。这种方法比解法1效率更高,因为它只遍历数组一遍。
代码示例:
function removeDuplicates(nums) {
if (nums.length === 0) {
return 0;
}
let slow = 0;
let fast = 1;
while (fast < nums.length) {
if (nums[fast] !== nums[slow]) {
nums[++slow] = nums[fast];
}
fast++;
}
return slow + 1;
}
时间复杂度: O(n)
空间复杂度: O(1)
解法3:集合法
这种方法使用集合数据结构来存储数组中的元素。当遇到重复元素时,我们只需将该元素添加到集合中。最后,我们将集合中的元素复制回数组中。这种方法的效率很高,但它需要额外的空间来存储集合。
代码示例:
function removeDuplicates(nums) {
if (nums.length === 0) {
return 0;
}
const set = new Set();
for (let i = 0; i < nums.length; i++) {
set.add(nums[i]);
}
let index = 0;
for (const num of set) {
nums[index++] = num;
}
return index;
}
时间复杂度: O(n log n)
空间复杂度: O(n)
解法4:快慢指针法
这种方法使用两个指针,一个指针指向当前正在处理的元素,另一个指针指向结果数组中的最后一个元素。当遇到重复元素时,我们只需将快指针指向下一个元素。当快指针遇到与慢指针不同的元素时,我们只需将快指针指向的元素复制到结果数组中。这种方法比解法1和解法2效率更高,因为它只遍历数组一遍。
代码示例:
function removeDuplicates(nums) {
if (nums.length === 0) {
return 0;
}
let slow = 0;
let fast = 1;
while (fast < nums.length) {
if (nums[fast] !== nums[slow]) {
nums[++slow] = nums[fast];
}
fast++;
}
return slow + 1;
}
时间复杂度: O(n)
空间复杂度: O(1)
结语
本文详细介绍了LeetCode数组问题——“删除有序数组中的重复项”的四种不同解法,包括基础双指针法、优化双指针法、集合法和快慢指针法。每种方法都有其优缺点,你可以根据实际情况选择最适合自己的方法。希望本文对你学习LeetCode数组问题有所帮助,也希望你能够在LeetCode的学习之旅中取得成功。