题目链接
给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。
不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
示例 1:
给定数组 nums = [1,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。
你不需要考虑数组中超出新长度后面的元素。
参考代码
var removeDuplicates = function(nums) {
let index = 0
for( let i=0,len=nums.length; i<len; i++ ){
if( nums[i] != nums[i+1] ) {
nums[index] = nums[i]
index++
}
}
nums.length = index;
return index
};
解法2:利用双指针
/**
* @description
* 双指针 快慢指针
* @param {number[]} nums
* @return {number}
*/
var removeDuplicates = function(nums) {
// 剪枝,当数组的长度为0或1时,直接返回数组的长度
if (nums.length < 2) return nums.length;
// 设慢指针指向数组的第一项
let left = 0;
// 快指针指向数组的第二项
let right = 1;
// 循环停止条件,快指针遍历完了数组
while (right < nums.length) {
if (nums[left] === nums[right]) {
// 当快指针和慢指针处的数据相同
// 则不处理,快指针向前进一位
right++
} else {
// 当快慢指针处的数据不相同时
// 将慢指针后一位的数据更改为快指针处的数据
// 同时快慢指针同时向前进一位
nums[left + 1] = nums[right];
right++;
left++;
}
}
// 最后返回慢指针 + 1 就是更新后数组的长度
// 同时数组数据得到了更新
return left + 1;
};