LeetCode 26.Remove Duplicates from Sorted Array

给出一个经过排序后的 int 型数组,将其中重复的值剔除掉。这道题目实际上使用两个指针,一前一后比较是否等值。如果等值,那么后面的指针再后移一位,如果不等值,前面的指针指向的元素更改为后面指针指向的元素,两两后移。

第一份代码

class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        if (nums.empty()) return 0;

        int index = 0;
        // 如果前后的值相等,后移一位
        for (int i = 1, n = nums.size(); i < n; ++i) if (nums[index] != nums[i])
            nums[++index] = nums[i];

        return (index + 1);
    }
};

代码拾遗:判断一个 vector 是否是空时,使用 vec.empty() 判断可能比 vec.size() == 0 更快。

第二份代码

class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        return distance(nums.begin(), unique(nums.begin(), nums.end()));
    }
};

代码拾遗:这处使用了两个 STL 函数 distance 和 unique。
distance 传入两个迭代器,返回两个迭代器中间的距离,这两个迭代器必须来源于同一个容器。如果容器的迭代器是 RandomAccessIterator 则返回两个迭代器相减,调用了 operator-。

本代码中, unique 传入两个迭代器,移除连续重复的元素,未被移除的元素保持原来的相对位置,并且如果一个未被移除的元素前有被移除的元素,那么将这个元素移动补缺。返回值为一个新的迭代器,是容器新的逻辑末尾,即一个新的 end 迭代器。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值