1. 程式人生 > >LeetCode 26:Remove Duplicates from sorted array

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%的答案