小菜鸟解LeetCode之删除排序数组中的重复项

301 阅读1分钟

来源:力扣(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
    
};

如下是测试结果