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

題目:

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

不要使用額外的數組空間,你必須在原地修改輸入數組並在使用 O(1) 額外空間的條件下完成。

 

思路1:

數組有序,

a、所以對重複數值的個數進行記錄,這裏使用k記錄

根據k值將當前值向前移動,這是去除前面重複數值之後當前值應該存在的位置

b、記錄數組不重複數字的個數,將後面的不重複數字按照個數加一,在數組中進行放置即可。

思路2:

使用set函數

 

思路1代碼如下(python):

    def removeDuplicates(self,nums):
        if len(nums)>0:
            j = nums[0]
        else:
            return 0
        k = 0   #用於記錄重複數值的個數
        i = 1
        while i < len(nums):
            if nums[i] == j:
                k = k + 1
            else:
                j = nums[i]
                nums[i - k] = nums[i]  #使用當前不重複的數值向前覆蓋
            i = i + 1
        return i - k
網上摘錄
int removeDuplicates(vector<int>& nums) {
    int i = !nums.empty();  
    for (int n : nums)
        if (n > nums[i-1])  
            nums[i++] = n;
    return i;
}


//使用i對於不重複數字位置進行記錄,i爲當前不重複數字的個數,對有序數組來講及是該數字在數組中的位置。
//對數組中的項進行遍歷,如果後一個大於已經記錄的前一個項,說明其不是重複的則對其進行記錄,否則其就是重複的不就行記錄
int removeDuplicates(int* nums, int numsSize)
{
    int pre = 0, cur = 0;
    if (numsSize == 0)
        return 0;
    while (cur < numsSize)
    {
        if (nums[pre] == nums[cur])
        {
            cur++;
        }
        else
        {
            nums[++pre] = nums[cur++];
        }
    }
    return pre + 1;
//與上個算法思路一樣,上個算法使用迭代遍歷數組,現在這個使用計數遍歷

 

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