来源:力扣(LeetCode)
链接:leetcode-cn.com/problems/re…
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题目描述
给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。 不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
初看这个题目很简单,小编试了很多方法,又双叒叕失败了,仔细看题目,重点是在原地修改数组,参考资料找到了两个方法:
方法一
- 思路:使用快慢指针,快指针遍历数组,当快指针和慢指针不同时,改变慢指针的位置,话不多说,看代码
var removeDuplicates = function(nums) {
var i=0;
if(nums.length===0) return 0
for(j=0;j<nums.length;j++){
if(nums[i]!==nums[j]){
i++
nums[i]=nums[j]
}
}
nums.splice(i+1,nums.length)
return i+1
};
如下是测试结果
方法二
var removeDuplicates = function(nums) {
if(nums.length<=1) return nums
for(let i=0;i<nums.length-1;i++){
if(nums[i]===nums[i+1]){
nums.splice(i,1)
i--
}
}
};
如下是测试结果
方法三
- 思路:k表示最多重复次数,利用数组是从小到大排列,判断与前面倒数第k个元素的大小改变i
var removeDuplicates = function(nums,k=1) {
var i=0
//遍历nums数组
for(let item of nums){
//最多重复次数为k,所以k之前的元素都是保留的,后面的元素通过判断对比k个之前的元素来操作(因为是保留k个)
if(i<k||item>nums[i-k])
nums[i++]=item
}
//返回保留的元素长度
return i
};
如下是测试结果