【Leetcode】80.删除有序数组中的重复项 II

68 阅读1分钟

leetcode-80.png

题目简述:每个元素最多出现两次,多余两次则过滤掉,只能在原数组上进行操作

var removeDuplicates = function (nums) {
    let cnt = 0
    let slow = 0
    let last = nums[0]  // 存储上一个元素的值
    for (let i = 0; i < nums.length; ++i) {
        // 当前元素跟上一元素相等
        if (nums[i] === last) {
            // 且计数小于 2
            if (cnt < 2) {
                cnt++
                // 进行赋值
                nums[slow++] = nums[i]
            }
            // 遇到 cnt > 2的情况不进行操作
            // 继续下一个元素 i++
            // 直至找到不相等的元素
        } else {
            // 如果不相等,表示遇到一个新的元素了
            // 更新last
            last = nums[i]
            // 进行赋值
            nums[slow++] = nums[i]
            // 计数器更新
            cnt = 1
        }
    }
    return slow
};

fast始终跟 slow指向的前两个元素做比较 如果相等 nums[fast] === nums[slow - 2],那么就不做处理,fast++,直至找到下一个不相等的元素,找到之后,然后进行赋值 nums[slow++] = nums[fast]

var removeDuplicates = function(nums) {
    if (nums.length <= 2) return nums.length;

    let slow = 2;  // 因为我们允许最多两个重复项,所以从索引 2 开始
    for (let fast = 2; fast < nums.length; fast++) {
        if (nums[fast] !== nums[slow - 2]) {
            nums[slow++] = nums[fast];
        }
    }
    return slow;
};