心得
其實這題不難,但為何這題花了我不少時間來想呢,還不是為了拚時間複雜度O(n)內呢!
雖然最後還是參考了別人的解法,不過也是讓我大開眼界啦。
題目
Given an unsorted integer array, find the smallest missing positive integer.
Note:
Your algorithm should run in O(n) time and uses constant extra space.
範例
Output: 3
Example 2:
Input: [3,4,-1,1]
Output: 2
Example 3:
Input: [7,8,9,11,12]
Output: 1
說明
這個解法與 Cycle Sort 有些相似。我們將其搬移至其所
能代表該值的索引值,便可達到分類的目的。
舉例來說,[3,1,2] 我們可以試著把 3 移動到 index = 2 的地方,
然而,那個位置原本就有一個 2,因此我們把 2 搬移到 index = 1 的地方,
依此類推,最後陣列會變成 [1,2,3]。
可能會有人問說,那重複值、負值或超過陣列大小的值該如何處理?
例如 [3,-1,7,2] 該怎麼辦呢?
答案是,忽略它吧!
我們先做相同的操作,陣列會變成 [7,-1,2,3]。
那麼變成這樣有什麼好處呢?我們可以試著分析一下:
假設今天有N個數,即陣列大小為N。
那可能會有以下情況:
1. 剛好滿足1~N
Ex: [3,1,2,4] => [1,2,3,4]
這是最顯而易見的情況, 我們只要求N+1,也就是5即可。
2. 有重複數字
Ex: [4,3,1,3] => [1,3,3,4]
仔細看看,我們需要的值也是由1開始往後檢查,
發現第一個3不在他所在的位置,所以顯然2是我們要找的。
3. 超出範圍
Ex: [8,-1,2,3] => [8,2,3,-1]
一旦我們無視超出範圍的值,同樣也只要找到不符合的部分即可。
綜上所述,我們便利用這些共同點,只要依次找到不符合的就是答案囉!
Best Runtime : 0ms - Faster than 100.00%
Best Memory Usage : 8.6MB - Less than 86.00%
Submitted on : 2019/08/12