昨天寫完每日題解忘記submit,將近連續200天的紀錄就炸了。太苦了。

題目

輸入一個有序遞增的陣列nums,同樣的數字最多只能出現2次,將多出來的數字去除掉。最後回傳去重複後的陣列長度。
必須使用in-place演算法。

解法

很明顯要使用雙指標。read表讀取位置,write表寫入位置,再維護一個last變數保存上次讀入的數字。
如果當前讀入與上次相同,則cnt+1,否則重置為1並更新last。如cnt小於等於2時,將last寫入write位置並遞增1。最後write會正好等於陣列長度,可以直接回傳。

class Solution:
    def removeDuplicates(self, nums: List[int]) -> int:
        N = len(nums)
        read = write = 0
        last = None
        cnt = 0
        while read < N:
            if nums[read] != last:
                last = nums[read]
                cnt = 1
            else:
                cnt += 1
            if cnt <= 2:
                nums[write] = last
                write += 1
            read += 1

        return write

優化一下,其實不需要last變數,因為透過write就可以知道上次碰到什麼數字了。

class Solution:
    def removeDuplicates(self, nums: List[int]) -> int:
        N = len(nums)
        read = write = 2
        while read < N:
            if nums[write-2] != nums[read]:
                nums[write] = nums[read]
                write += 1
            read += 1

        return write