LeetCode 80.删除有序数组中的重复项 II

Posted KyrieLiu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 80.删除有序数组中的重复项 II相关的知识,希望对你有一定的参考价值。

与LeetCode26不同,允许一个元素最多出现两次

解法一:双指针法+计数器

分析:

仍然使用双指针法,一个用来覆盖(下面代码中的 index ),一个用来遍历(下面代码中的 i

区别在于,使用一个计数器count,代表当前正在遍历的元素(即 i 指向的元素)重复的次数,初始值为1,即重复1次(不重复)

1)如果 nums[i] == nums[i-1] ,就增加重复次数计数器count

2)否则,就重置count为1

让当前重复次数小于等于2的元素覆盖到 index 的位置,并后移index指针。

代码

int removeDuplicates2(vector<int>& nums){
    if(nums.size()<=2) return nums.size();

    //使用count,计数器
    int count=1;
    int index=1; //下次要替换的元素位置 
    for(int i=1;i<nums.size();i++){
        if(nums[i]==nums[i-1])
            count++;
        else
            count=1;
        
        if(count<=2){
            nums[index]=nums[i];
            index++; 
        }
    } 
    return index;
}

解法二:双指针法(不使用计数器)

分析:

仍然使用双指针法,一个指向下一个覆盖的位置(下面代码中的 index ),一个用来遍历(下面代码中的 i

区别在于,比较 nums[i]nums[i-2]

1)如果 nums[i] == nums[i-2] ,就让 i 后移

2)如果 nums[i] != nums[i-2] ,就将 i 指向的元素 赋值 到index 的位置,然后后移 indexi

因为,一个元素nums[i] 如果最多出现两次,他与 nums[i-2] 一定不同,就满足要求,可以添加到前面的序列中,覆盖前面的元素,否则,就出现了两次以上,不满足要求,直接后移 i 即可。

代码

int removeDuplicates2(vector<int>& nums){
    if(nums.size()<=2) return nums.size();
    
    //不使用count 
    int index=2;
    for(int i=2;i<nums.size();i++){
        if(nums[i] != nums[index-2]){
            nums[index++] = nums[i];
        }
    }
    return index;
}

以上是关于LeetCode 80.删除有序数组中的重复项 II的主要内容,如果未能解决你的问题,请参考以下文章

Python描述 LeetCode 80. 删除有序数组中的重复项 II

Python描述 LeetCode 80. 删除有序数组中的重复项 II

Python描述 LeetCode 80. 删除有序数组中的重复项 II

Python描述 LeetCode 80. 删除有序数组中的重复项 II

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

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