LeetCode26

LeetCode26,第1张

删除有序数组中的重复项 1. 题目描述

给你一个升序排列的数组nums,请你原地删除重复出现的元素,使每一个元素只出现一次,返回删除后数组的新长度。返回后的元素应当也是升序排列的。

示例
输入:[0,0,1,1,1,2,2,3,3,4]
输出:5,nums = [01,2,3,4]

2. 解法

解法为双指针。

一个指针 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();
    }
};

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/713551.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-24
下一篇 2022-04-24

发表评论

登录后才能评论

评论列表(0条)

保存