删除排序数组中的重复项

Posted 精诚所至 金石为开

tags:

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

给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。

不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。

 

我的实现:(效率很低,276ms)

class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        int ret = nums.size();
        for (int i = 0 ; i< ret - 1;)
        {
            if(nums.at(i) != nums.at(i+1))
            {
                ++i;
                continue;
            }
            else
            {
                for(int j = i ; j < ret-1; ++j)
                {
                    nums.at(j) = nums.at(j+1);
                }
                ret--;
            }
            
        }
        return ret;
    }
};

 

大神实现:(16ms)

1 class Solution {
2 public:
3     int removeDuplicates(vector<int>& nums) {
4          nums.erase(std::unique(nums.begin(), mums.end()), nums.end());
5          return noms.size();
6     }
7 }    

 

std::unique,

消除连续组中的除了第一个元素的其他相同的元素;

消除后的元素之间的相对位置不变;

返回新的past-the-end;

http://en.cppreference.com/w/cpp/algorithm/unique

 

参考std::unique的实现了一个版本:(28ms)

class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        int ret = 1;
        vector<int>::iterator beginIter = nums.begin();
        vector<int>::iterator endIter = nums.end();
        if(beginIter == endIter)
            return 0;
        
        vector<int>::iterator resultIter = beginIter;
        
        while(++beginIter != endIter)
        {
            if((*beginIter != *resultIter) )
            {  
                ++resultIter;
                *resultIter = std::move(*beginIter);
                ++ret;
            }
        }
        ++resultIter;
        

        return ret;
    }
};

 

 

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

LeetCode 26删除排序数组中的重复项

前端与算法 leetcode 26. 删除排序数组中的重复项

leetcode-----26. 删除排序数组中的重复项

删除排序数组中的重复项

从排序数组中删除重复项(不同的最终结果)

删除排序数组中的重复项