給定一個排序數組,你須要在原地刪除重複出現的元素,使得每一個元素只出現一次,返回移除後數組的新長度。不要使用額外的數組空間,你必須在原地修改輸入數組並在使用 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)排序