首页 > 编程语言 > 详细

删除排序数组中的重复项

时间:2018-04-27 11:16:12      阅读:174      评论:0      收藏:0      [点我收藏+]

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

不要使用额外的数组空间,你必须在原地修改输入数组并在使用 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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!