Leetcode 26.刪除排序數組中的重複項

題目

給定一個排序數組,你需要在原地刪除重複出現的元素,使得每個元素只出現一次,返回移除後數組的新長度。
不要使用額外的數組空間,你必須在原地修改輸入數組 並在使用 O(1) 額外空間的條件下完成。

示例 1:

給定數組 nums = [1,1,2], 函數應該返回新的長度 2, 並且原數組 nums 的前兩個元素被修改爲 1, 2。
你不需要考慮數組中超出新長度後面的元素。

示例 2:

給定 nums = [0,0,1,1,1,2,2,3,3,4],函數應該返回新的長度 5, 並且原數組 nums 的前五個元素被修改爲 0,
1, 2, 3, 4。 你不需要考慮數組中超出新長度後面的元素。

代碼

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

雙下標法,i下標指向舊的有重複元素的nums,j下表指向新的沒有重複元素的nums。當nums[i]與nums[j]不相同時,在nums[j]中添加nums[i],j向後移動。最後j的長度便是nums的新長度。
小技巧:可以通過減少vector函數的調用來降低運行時間,爲此創建了length變量。

結果

在這裏插入圖片描述
另外給出兩種STL的解法,不過效率都不太好

class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        return distance(nums.begin(),removeDuplicates(nums.begin(),nums.end(),nums.begin()));
    }
    template<typename InIt,typename OutIt>
    OutIt removeDuplicates(InIt first,InIt last,OutIt output)
    {
        while(first!=last)
        {
            *output++ = *first;
            first = upper_bound(first,last,*first);
        }
        return output;
    }
};
class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        return distance(nums.begin(),unique(nums.begin(),nums.end()));
    }
};

參考資源:

Leetcode 26
Leetcode題解

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章