给你一个升序排列的数组nums,请你原地删除重复出现的元素,使每一个元素只出现一次,返回删除后数组的新长度。返回后的元素应当也是升序排列的。
2. 解法示例
输入:[0,0,1,1,1,2,2,3,3,4]
输出:5,nums = [01,2,3,4]
解法为双指针。
一个指针 i t it it固定不动,另一个指针 i t 1 it1 it1从 i t + 1 it+1 it+1开始往后遍历,每遍历一个数据,就判断一下 i t it it与 i t 1 it1 it1的大小关系:如果相等,那么 + + i t 1 ++it1 ++it1,否则就删除这两个指针之间的数据,然后将 i t it it指向被删除的最后一个数据的后一个位置。
class Solution {
public:
int removeDuplicates(vector<int>& nums)
{
//如果长度小于2,则无重复数据,直接返回size
if(nums.size() <= 1)
{
return nums.size();
}
for(auto it=nums.begin();it!=nums.end();)
{
auto it1=it+1;
//it1!=nums.end()这一句是为了防止it1变成尾后指针,无法解引用
while(it1!=nums.end() && *it==*it1)
++it1;
//如果差值为1,则之间无重复值,直接递增it走下一步的循环
if(it1-it==1)
{ ++it;}
else//否则擦除it+1与it1之间的数据,此时之前的迭代器失效
//erase会返回一个迭代器指向原来it1指向的地址
//因此将it重新赋值
{
it=nums.erase(it+1,it1);
}
}
return nums.size();
}
};
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)