1. 程式人生 > >LeetCode:刪除排序數組中的重復項||【80】

LeetCode:刪除排序數組中的重復項||【80】

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】