Leetcode算法練習篇十:刪除排序數組中的重複項

問題描述

給定一個排序數組,你需要在原地刪除重複出現的元素,使得每個元素只出現一次,返回移除後數組的新長度。

不要使用額外的數組空間,你必須在原地修改輸入數組並在使用 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。

你不需要考慮數組中超出新長度後面的元素。

解法

使用雙指針prep分別指向第一個不重複的元素和當前循環元素,則在循環指針移動的時候判斷值是否相同,若相同,移動交換prep 指針所指向的內容,然後後移prep,否則,只後移p指針。重複以上過程直至p到達數組末尾。返回pre+1即爲新數組大小

複雜度

首先至少要遍歷一遍數組,故時間複雜度爲O(n),而空間上只需要原地交換元素即可,複雜度O(1)。

C++

static const auto io_sync_off=[](){
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    return nullptr;
}();
class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        if(size(nums)<=1)return size(nums);
        
        int p=1,pre=0,len=size(nums);
        while(p<len){
            if(nums[pre]==nums[p])
                p++;
            else{
                nums[pre+1]=nums[p];
                p++;
                pre++;
            }
        }
        return pre+1;        
    }
};

Python

class Solution:
    def removeDuplicates(self, nums: List[int]) -> int:
        if nums is None:
            return
        if len(nums)<=1:
            return len(nums)
        pre=p=0
        LEN=len(nums)
        while p<LEN:
            if p==pre:
                p+=1
                continue
            if nums[p]==nums[pre]:
                p+=1
            else:
                nums[pre+1]=nums[p]
                p+=1
                pre+=1
        return pre+1
                
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章