給定一個排序數組,你需要在 原地 刪除重複出現的元素,使得每個元素只出現一次,返回移除後數組的新長度。
不要使用額外的數組空間,你必須在 原地 修改輸入數組 並在使用 O(1) 額外空間的條件下完成。
思路:
- 處理邊界情形,長度小於等於1,直接返回1即可
- 使用
index
變量標記新得到數組的元素索引,依次在這個位置上放上正確的值,然後+1
處理下一個 - 從下標爲
i=1
開始遍歷數組,只有當元素不等於前一個元素時,就說明i-1
爲重複元素的末尾,要將上面的元素放到index
上面了 - 關鍵是數組最後一個元素怎麼處理。最後一個元素一定會放到
index
上,爲了代碼的簡潔性,我將原來的數組末尾人爲添加一個與原數組最後一個元素不同的元素。
class Solution:
def removeDuplicates(self, nums: List[int]) -> int:
if len(nums)<=1:
return 1
nums.append(nums[-1]+1)
index = -1
for i in range(1, len(nums)):
if nums[i]!=nums[i-1]:
index += 1
nums[index] = nums[i-1]
return index+1
寫代碼中注意幾點:
- 邊界情形,數組爲空,元素個數爲1,首先處理掉,這樣後續的代碼就可以把最小的例子放在心中去比照着去寫代碼,邊寫邊驗證,不要等到最後才調試
- 輔助變量的使用,這裏是新數組的
index
,這是與題目要求一致的變量,這個變量有了問題的輸出也就有了,也就是這個變量最好與輸出變量一起考慮 - 循環的使用,考慮清楚遍歷的起始和終止,是順序還是逆序
- 判斷的使用,只取具有實際操作的判斷,問題中只有連續兩個元素不等時纔有變化,相等時遍歷即可,所以使用不等作爲判斷條件,這個要與最終輸出一起考慮,要逐漸向輸出靠攏