LeetCode:刪除排序數組中的重復項||【80】
阿新 • • 發佈:2018-09-20
num 相同 指針 分享 col ima spa 一位 png
LeetCode:刪除排序數組中的重復項||【80】
題目描述
給定一個排序數組,你需要在原地刪除重復出現的元素,使得每個元素最多出現兩次,返回移除後數組的新長度。
不要使用額外的數組空間,你必須在原地修改輸入數組並在使用 O(1) 額外空間的條件下完成。
示例 1:
給定 nums = [1,1,1,2,2,3], 函數應返回新長度 length =5
, 並且原數組的前五個元素被修改為1, 1, 2, 2,
3 。 你不需要考慮數組中超出新長度後面的元素。
示例 2:
給定 nums = [0,0,1,1,1,1,2,3,3], 函數應返回新長度 length =7
, 並且原數組的前五個元素被修改為0
, 0, 1, 1, 2, 3, 3 。 你不需要考慮數組中超出新長度後面的元素。
題目分析
題目中說了,原地修改,這道題的變形題目有很多,最優算法也各不相同。
1.從哪裏下手?
但是這道題應該掌握的最基本的算法是數組原地刪除元素,思路是這樣的從比如要刪第N個元素,就從N個元素開始,使其值等於N+1的元素的值。
這樣第N+1往後的元素都往前移動一位,就會覆蓋掉第N個元素,從而實現元素的刪除。
2.那麽這道題呢?
這道題由於要保留2位相同的元素,那麽我們就要從第N+2個元素開始前移了。只要第N個元素和第N+2個元素值相同,我們就要從第N+2個元素開始前移動,而不需要管第N+1個元素(不管與第N個元素相等否都滿足題目要求)。同時我們要卡一個右邊界,下圖綠色箭頭顯示 。如果第N個元素與第N+2個元素不相同,那麽黑色和藍色指針同時後移,直到綠色和藍色箭頭重合。
Java題解
高效題解
一次循環就實現,因為題目中已經明確說明,數組已經排序,這句話的意思是相同元素都在一起挨著。
LeetCode:刪除排序數組中的重復項||【80】