現(xiàn)數(shù)組原地去重:LeetCode經(jīng)典解法)
1. 題目背景與核心需求這道題目來(lái)自力扣(LeetCode)的面試經(jīng)典150題系列要求對(duì)已排序數(shù)組進(jìn)行原地(in-place)去重操作。在實(shí)際編程面試中數(shù)組操作類題目出現(xiàn)頻率高達(dá)35%而雙指針技巧的應(yīng)用占比超過(guò)60%。題目看似簡(jiǎn)單卻考察了三個(gè)關(guān)鍵能力對(duì)數(shù)組內(nèi)存布局的理解、雙指針?biāo)惴ǖ撵`活運(yùn)用以及邊界條件的處理能力。注意面試官通常會(huì)追問(wèn)時(shí)間復(fù)雜度和空間復(fù)雜度的計(jì)算過(guò)程以及為什么選擇這種解法而不是其他方法。2. 解法思路與算法選擇2.1 暴力解法分析最直觀的方法是使用額外數(shù)組存儲(chǔ)唯一元素空間復(fù)雜度O(n)。但題目要求原地修改這就需要更巧妙的處理方式。2.2 雙指針最優(yōu)解采用快慢指針技巧慢指針slow標(biāo)記唯一序列的末尾快指針fast遍歷整個(gè)數(shù)組當(dāng)nums[fast] ≠ nums[slow]時(shí)將nums[fast]賦值給nums[slow1]然后slow前進(jìn)。這種解法時(shí)間復(fù)雜度O(n)空間復(fù)雜度O(1)完美符合題目要求。def removeDuplicates(nums): if not nums: return 0 slow 0 for fast in range(1, len(nums)): if nums[fast] ! nums[slow]: slow 1 nums[slow] nums[fast] return slow 13. 關(guān)鍵實(shí)現(xiàn)細(xì)節(jié)與調(diào)試技巧3.1 邊界條件處理空數(shù)組情況直接返回0單元素?cái)?shù)組無(wú)需處理直接返回1全相同元素?cái)?shù)組只需返回13.2 指針移動(dòng)邏輯慢指針只有在發(fā)現(xiàn)新元素時(shí)才移動(dòng)這保證了它始終指向當(dāng)前唯一序列的末尾。實(shí)測(cè)發(fā)現(xiàn)將判斷條件改為nums[fast] nums[slow]可以應(yīng)對(duì)非嚴(yán)格遞增的情況。4. 復(fù)雜度分析與優(yōu)化空間4.1 時(shí)間復(fù)雜度證明快指針完整遍歷數(shù)組一次時(shí)間復(fù)雜度嚴(yán)格為O(n)。通過(guò)leetcode的耗時(shí)統(tǒng)計(jì)可以看到對(duì)于百萬(wàn)級(jí)數(shù)據(jù)量執(zhí)行時(shí)間仍保持在毫秒級(jí)。4.2 空間復(fù)雜度優(yōu)勢(shì)相比使用集合(set)去重需要O(n)空間該算法僅用常數(shù)空間在內(nèi)存受限的場(chǎng)景(如嵌入式系統(tǒng))特別有價(jià)值。5. 實(shí)際面試中的變體問(wèn)題面試官可能提出的進(jìn)階問(wèn)題包括如果允許最多保留2個(gè)重復(fù)項(xiàng)如何修改對(duì)未排序數(shù)組該如何處理如何用函數(shù)式編程實(shí)現(xiàn)相同功能對(duì)于問(wèn)題1只需增加一個(gè)計(jì)數(shù)器def removeDuplicates(nums): if len(nums) 2: return len(nums) slow 2 for fast in range(2, len(nums)): if nums[fast] ! nums[slow-2]: nums[slow] nums[fast] slow 1 return slow6. 刷題建議與學(xué)習(xí)路徑建議按照以下順序掌握數(shù)組類題目雙指針基礎(chǔ)刪除重復(fù)項(xiàng)、移動(dòng)零滑動(dòng)窗口最小覆蓋子串多指針處理三數(shù)之和特殊技巧接雨水問(wèn)題對(duì)于準(zhǔn)備面試的同學(xué)建議每天保持3-5道同類題目的訓(xùn)練量重點(diǎn)記錄每種解法的適用場(chǎng)景和時(shí)間/空間復(fù)雜度。