↓快轉到主要內容
  1. LeetCode/

LeetCode 26: Remove Duplicates from Sorted Array

·1 分鐘· ·
LeetCode Easy Array Two-Pointers
Wei Yi Chung
作者
Wei Yi Chung
Working at the contributing of open source, distributed systems, and data engineering.
目錄

基本資料
#

難易度: easy 第一次嘗試:2020-01-30

  • 提交紀錄:Compile Error → Output Limit Exceeded → Accepted → Runtime Error ×5 → Wrong Answer ×2 → Runtime Error → Wrong Answer → Accepted → Runtime Error → Wrong Answer → Runtime Error ×3 → Accepted ×2

解題思路
#

已排序,重複的值相鄰。用一個寫入指標 k(Two Pointers 模板五):掃過每個數,跟最後寫入的 nums[k - 1] 不一樣才寫到 nums[k],k += 1。最後回傳 k,前 k 個就是不重複的值。

我的嘗試
#

這是我 2020、2022 年最早寫的幾題之一,前面的錯大多是沒看懂題目要什麼:回傳了 tuple 或新的 list、算出來的 k 是重複的個數而不是剩下的個數。之後一版寫入的條件不對,重複的值沒有被跳過,例如 [2, 2, 4] 前兩個是 [2, 2]。

正確解法
#

class Solution:
    def removeDuplicates(self, nums: List[int]) -> int:
        k = 1
        for x in nums[1:]:
            if x != nums[k - 1]:
                nums[k] = x
                k += 1
        return k

複雜度
#

時間 O(n),空間 O(1)。

要特別避免的錯誤
#

  • 要原地修改陣列並回傳長度,不是回傳新的 list。

面試口說整理
#

陣列已排序,我用寫入指標,只有跟上一個寫入的值不同時才寫進去並前進,最後回傳寫入的個數。時間 O(n)、空間 O(1)。

相關文章

LeetCode 14: Longest Common Prefix
·1 分鐘
LeetCode Easy Array String Trie
LeetCode 14 解題筆記:用最短的字串當上限,逐個位置檢查所有字串是否相同,第一個不同的位置就是答案的長度
LeetCode 1: Two Sum
·1 分鐘
LeetCode Easy Array Hash-Table
LeetCode 1 解題筆記:一邊掃一邊把看過的數存進雜湊表,查 target - x 有沒有出現過;先查再存,同一個元素才不會用兩次
LeetCode 9: Palindrome Number
·1 分鐘
LeetCode Easy Math
LeetCode 9 解題筆記:負數一定不是回文;不轉字串的話,把後半段的數字反轉,跟前半段比較
LeetCode 13: Roman to Integer
·1 分鐘
LeetCode Easy Hash-Table Math String
LeetCode 13 解題筆記:從左到右加每個符號的值,如果它比右邊的符號小就改成減
LeetCode 7: Reverse Integer
·1 分鐘
LeetCode Medium Math
LeetCode 7 解題筆記:記下正負號,對絕對值反轉位數,結果超出 32 位元有號整數的範圍就回傳 0