LeetCode 26:Remove Duplicates from sorted array

这一题总的来说很简单,最容易想到的就是遍历数组,判断是否和前一个数相同,相同的话就删除,不删除的话计数加1

class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        if(nums.empty()) return 0;
        int tmp= nums[0];
        int num=1;
        for(vector<int>::iterator it=nums.begin()+1;it!=nums.end();)
        {
            while(*it==tmp)
            {
                it=nums.erase(it);
                if(it==nums.end())
                {
                    break;
                }
            }
            if(it!=nums.end())
            {
                tmp=*it;
                it++;
                num++;
            }
        }
        return num;
    }
};

但是这种方式总是在数组循环过程中修改数组元素,总感觉不是很安全和高效,事实证明只能打败46%答案。因此可以换一种思路,遍历数组,碰到一个新的数值就将它覆盖头指针的数值,头指针加一,最后统一删除头指针后面的元素即可,结果可以打败70%左右的答案。

class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        if(nums.empty()) return 0;
        if(nums.size()==1) return 1;
        int i=0;
        
        for(int j=i+1;j<nums.size();j++)
        {
            if(nums[i]!=nums[j])
            {
                    nums[++i]=nums[j];
            }
        }
        for(vector<int>::iterator it=nums.begin()+i+1;it!=nums.end();)
        {
            it=nums.erase(it);
        }
        return i+1;
    }
};

这一题和27像,可以用同样的方式解决:

方法如下:

class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        int i=0;
        
        for(int j=0;j<nums.size();j++)
        {
            if(nums[j]!=val)
            {
                nums[i++]=nums[j];
            }
        }
    
        
        for(vector<int>::iterator it=nums.begin()+i;it!=nums.end();)
        {
            it=nums.erase(it);
        }
        return nums.size();
    }
};

可以打败98%的答案

猜你喜欢

转载自blog.csdn.net/weixin_41526905/article/details/83656047