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

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

不要使用额外的数组空间,你必须在原地修改输入数组并在使用 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;
    }
};
原文地址:https://www.cnblogs.com/jimobuwu/p/8961069.html