JavaScript原地删除有序数组重复项的双指针解法

作者:异步漫步

时间:2026-10-25

浏览:402

本文介绍如何在JavaScript中利用双指针法原地删除有序数组中的重复元素。通过定义快慢指针,在遍历过程中比较元素并修改数组,最终返回新长度。该方法严格遵循O(1)额外空间限制,无需创建新数组,适用于LeetCode等算法场景。

文章目录

问题描述与约束条件

问题描述与约束条件

假设存在一个有序数组 nums ,任务要求在不创建新数组的情况下,原地移除其中重复出现的元素,确保每个元素仅保留一次,并返回处理后数组的有效新长度。

算法必须满足空间复杂度为 O(1) 的约束,即只能使用常数级的额外空间,并直接在原输入数组上进行修改操作。

题目说明:

为何函数返回的是整型数值,而实际输出结果却表现为数组形式?

关键点在于:输入数组是通过「引用」传递的,这意味着在函数内部对数组进行的任何修改,调用者都能直接观察到变化。

内部逻辑可理解为:

// nums 是以“引用”方式传递的。也就是说,不对实参做任何拷贝
int len = removeDuplicates(nums);

// 在函数里修改输入数组对于调用者是可见的。
// 根据你的函数返回的长度, 它会打印出数组中 该长度范围内 的所有元素。
for (int i = 0; i < len; i++) {
print(nums[i]);
}

示例 1:

输入:nums = [1,1,2] 输出:2, nums = [1,2] 解释:函数应返回新长度 2,并将原数组 nums 的前两个元素更新为 1, 2。数组中超出新长度的后续元素无需关注。

示例 2:

输入:nums = [0,0,1,1,1,2,2,3,3,4] 输出:5, nums = [0,1,2,3,4] 解释:函数应返回新长度 5,并将原数组 nums 的前五个元素更新为 0, 1, 2, 3, 4。同样,超出新长度的元素无需处理。

注意:

  • ​​0 <= nums.length <= 3 * 104​​
  • ​​-104 <= nums[i] <= 104​​
  • 数组 ​nums​ 已按升序排列

双指针法解题思路

解题思路:

鉴于数组 nums 本身有序,且限制条件禁止创建新数组来存储去重后的结果,我们必须直接在原数组上操作。

策略是边遍历边比对,当发现不同元素时立即更新数组。为此,可采用双指针技术中的快慢指针模式,分别定义 slow 和 fast 作为两个指针变量;

初始化阶段,慢指针 slow 指向数组起始位置(即 nums[0]),快指针 fast 指向慢指针的下一位(即 nums[1])。

随着快指针 fast 向后移动,持续将 fast 指向的元素与 slow 指向的元素进行对比:

JavaScript代码实现

代码实现:

/**
* @param {number[]} nums
* @return {number}
*/
var removeDuplicates = function(nums) {
if(nums.length == 0){return 0;}
let slow = 0, fast = 1;
while(fast < nums.length){
if(nums[fast] != nums[slow]){
slow = slow + 1;
nums[slow] = nums[fast];
}
fast = fast + 1;
}
return slow + 1;
};

至此,关于JavaScript删除有序数组中重复项的双指针解法介绍完毕。如需了解更多JS处理数组重复项的技巧,可查阅本站往期文章或继续浏览后续内容,感谢支持!

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章