题目描述:给定一个整型数组,要求去除重复的数据,返回去重后的数组长度
method1:双指针(官方题解)
题目给定一个已经排好序的序列,我们可以设置双指针,一个slow指针,一个fast指针。fast指针用于跳过重复的数据,slow指针用于记录非重复的数据,即fast指针当前所指数据如果跟slow指针所指数据不同时,则slow++,并复制fast指针数据,赋值给slow指针所指数据。如此循环往复,直到fast指针达到最后给定整型数组的大小,循环结束
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
//双指针算法:快指针用于跳过重复数据,慢指针用于指示不重复的数据
int slow=0,fast=1;
if(nums.size()<2)//当vector长度小于2时,返回vector长度
return nums.size();
while(fast<nums.size()){
if(nums[fast]==nums[slow])
fast++;
else{
slow++;
nums[slow]=nums[fast];
}
}
return slow+1;
}
};
将上述代码copy到oj上实际运行时间
method2:使用erase()函数来去除重复的值,使用指针遇到重复数值,则删除掉,最后剩下在vector中的,就是所有不重复的数值,返回vector的size()即可
auto it=nums.begin();//自己使用erase函数来去除重复的元素值
auto next=it+1;
for(it;it!=nums.end()&&next!=nums.end();){//erase:在擦除指定元素之后,自动将后面的元素向前移动,填补空位
if(*it==*next){
nums.erase(next);
}
else{
it++;
next++;
}
}
return nums.size();