力扣26:删除有序数组中的重复项

0 阅读1分钟

~False:索引塌陷+时间超限 在遍历数组的同时删除元素,会导致索引错位

--执行删除操作 nums.splice(j,1)时,数组后面的元素会整体向前移动一位,填补被删除的空缺; --场景复现:如果输入是 [1, 1, 1, 2]

  1. i=0, j=1:发现相同,删掉 nums[1]。数组变成 [1, 1, 2]
  2. j 自增变成 2。此时 nums[2] 是 2
  3. 漏掉了现在索引为 1 的那个 1
/**
 * @param {number[]} nums
 * @return {number}
 */
var removeDuplicates = function(nums) {
    let len=nums.length;
    for (let i=0;i<len;i++){
        for (let j=i+1;j<len;j++){
            if (nums[i]==nums[j]){
                nums.splice(j,1);
                j--;//索引塌陷
            }
        }
    }
    
    return nums.length;
};

~True:双指针(针对有序数组)

/**
 * @param {number[]} nums
 * @return {number}
 */
var removeDuplicates = function(nums) {
    if (nums.length==0) return 0;
    let slow=0;
    for (let fast=1;fast<nums.length;fast++){
        if(nums[fast]!=nums[slow]){
            slow++; //先将slow移动到待填的位子上
            nums[slow]=nums[fast];
        }
    }
    return slow+1;

};