03.08 26.刪除排序數組中的重複項(LeetCode 題解)

26.刪除排序數組中的重複項(LeetCode 題解)

假設我們有一個傳感器,會不停地向 HQ 傳輸已經歸類好數據,數據的格式全部是數字(種類編號),且已經按照從小到達的順序排列,大概是 [1,1,4,5,7,9] 這樣的,但是我們的需求在於,希望知道有多少個種類,那麼該如何解決呢?

如果這樣一個問題放在關係型數據庫中操作的話就非常方便了,學過 SQL 語言的同學很快就會想到 DISTINCT 關鍵字,剩下的就是拼接一下 SELECT 語句出來就好了,但是如果我們的問題不是 SQL 相關的呢?

力扣(LeetCode) 中 "26.刪除排序數組中的重複項 " 正是一個類似要求的題目。

26.刪除排序數組中的重複項(LeetCode 題解)

注意在題目當中要求的是:不要使用額外的數組空間,你必須在 原地修改輸入數組 並在使用 O(1) 額外空間的條件下完成,意味著不能通過新建數組存放的方式解決,那麼對於這樣一個問題我們該如何解決呢?

可以考慮增加一個遊標的方式(命名為:index),遍歷整個數組,當遇到前一個和後一個不相等的時候就給遊標自增,這樣的話對於相同的元素可以直接跳過不統計,最後返回”遊標的大小+1“(也即不重複的元素的個數),代碼實現如下:

26.刪除排序數組中的重複項(LeetCode 題解)

這樣的話就符合了題目所要求的各個複雜度以及就地統計的原則,當然,如果你對 STL 比較熟悉的話這道題其實可以偷懶一下:

26.刪除排序數組中的重複項(LeetCode 題解)

比較容易是不是?我們對題目做一點改變,由於傳感器有一個誤差的區間,對於所有可能的種類我們允許它最多出現兩次,認為是不同的兩個種類,這樣的話問題該如何解決呢?

由於要求是兩次,所以我們可以考慮通過增加一個變量的方式來記錄種類編號出現的次數就可以了嘛,代碼實現如下:

26.刪除排序數組中的重複項(LeetCode 題解)

這樣的話我們又可以正確地統計到種類個數了。

以上是 力扣(LeetCode)中兩道題目 "26.刪除排序數組中的重複項" 和 "80.刪除排序數組中的重複項 II"的拓展,由於這兩道題是從簡單到複雜的的一個過程,從對於題目的解答中我們可以慢慢培養接近一個問題的解決方案的思路,掌握瞭解決特定情況問題的方法之後,就可以慢慢得到一個通用問題的解決方案,一次次迭代下去,想到新的思路就比較容易了。



分享到:


相關文章: