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

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

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

劃重點:1.排序數組 2.原地刪除優化

錯誤思路:
1.聲明一個tmp,初始就是nums[0],用做被比較的對象
2.用tmp去和每個後面的數去對比,相同的跳過,不一樣的,先把nums[j]設成tmp,而後j++,tmp變成不一樣的那個數
錯誤點:
1.使用了新的內存空間,是錯誤的
2.tmp要和後面的數去比,tmp若是走到了最後一個,那麼後面必然會產生越界。
3.tmp最後必定是一個和前面不一樣的數,這個數不參與比較,那麼必定不會被覆蓋寫入數組
好比{1,1,2,2,3,3}->{1,2,2,2,3,3}指針

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

思路:
要求原地刪除,那麼必定使用快慢指針進行元素的覆蓋操做。
聲明兩個指針,i爲快指針,j爲慢指針
若是遇到相同的數,那麼就跳過,i++。
若是遇到不一樣的數,將這個值的下一個數給替換成這個不同的值。code

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

    }
    System.out.println(j+1);
    return j+1;
}

代碼寫的不夠優雅,由於判斷相等而後continue是沒有必要的,優化一下:對象

public static int removeDuplicates(int[] nums)
{
    int j = 0;
    for(int i = 1; i < nums.length; i++)
    {
        if(nums[j] != nums[i])
        {
            j++;
            nums[j] = nums[i];
        }

    }
    return j+1;
}

複雜度分析:
遍歷一遍,時間複雜度o(n)
空間複雜度,o(1)排序

相關文章
相關標籤/搜索