leetcode刷題記錄--【80 Remove Duplicates from Sorted Array II】

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

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

錯誤思路:
由26題跳過一個的思路,很天然的聯想到跳過2個便可。可是對於{0,0,1,1,1,1,2,3,3}這種狀況,最後一個3沒法被放到前面去,結果是{0,0,1,1,2,3,2,3,3},這是由於錯誤代碼將第一個不一樣的值移動到正確位置之後,下一個和剛被移動的這個值比對若是相同的話,是要等待下一次移動的,而下一次已經到了數組末尾,再也不進行移動操做。
因此增長針對最後一個元素的處理(由於我只想到了最後一個元素可能和剛被移動的元素相同的狀況),可是又引起了一個bug,即{1,1,1,2,2,3}->{1,1,2,2,3,3},當所有移動完成後,我會單獨去比較最後一個元素是否和剛被移動的相同,相同的話,直接放到剛被正確安放的元素後,這樣就致使了重複數據的出現。code

public static int removeDuplicates(int[] nums)
{
    int i = 0, j = 0, count=1;
    for(i = 1; i < nums.length; i++)
    {
        if(nums[i] != nums[j])
        {
            if (count >= 2)
            {
                j = j + 2;
                nums[j] = nums[i];
            }
            else
            {
                j = j + 1;
                nums[j] = nums[i];
            }
            count = 1;
        }
        else
        {
            count++;
        }
    }
    if (nums[nums.length - 1] == nums[j])
    {
        j = j + 1;
        nums[j] = nums[nums.length - 1];
    }
    System.out.println(j+1);
    return j+1;
}

正確思路:對象

public int removeDuplicates(int[] nums)
{
    int i = 0, j = 0, count=1;
    for(i = 1; i < nums.length; i++)
    {
        if(nums[i] == nums[i-1])
        {
            count++;
        }
        else
        {
            count = 1;
        }

        if (count <= 2)
        {
            j = j + 1;
            nums[j] = nums[i];
        }
    }
    System.out.println(j+1);
    return j+1;
}

1.對於每個元素,都進行移動。
2.計算相同的個數,相同的數量在2個以上時,就不進行移動
3.不是比較nums[i]和nums[i+1],由於這樣會致使溢出,參見26題的錯誤思路。或者比較不到最後一個對象。排序

相關文章
相關標籤/搜索