给出一个经过排序后的 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 迭代器。