前往
大廳
主題

LeetCode - 448. Find All Numbers Disappeared in an Array 解題心得

Not In My Back Yard | 2020-10-24 21:13:21 | 巴幣 2 | 人氣 212

題目連結:


題目意譯:
給定一個整數陣列 a ,其中 1 ≦ a[i] ≦ n (n 為陣列大小)。且有些元素出現兩次,其他的出現一次。

找到所有 [1, n] (含左、右端點)這個範圍之中哪些數字沒有出現在陣列之中。

你可以在不使用額外記憶體並以時間複雜度 O(n) 的情況下實作出來嗎?你可以假設回傳的陣列(所求)不算作額外空間。



範例測資:
輸入:
[4,3,2,7,8,2,3,1]
輸出:
[5,6]


解題思維:
如果陣列的數字是 1 ~ n 都出現一次且僅此一次,則由小到大重新排序之後,則可以看到 a[i] = i(假設陣列的索引值從 1 開始)。

因此,我們可以掃過陣列 a ,對於每個數字 a[i] ,判斷 a[i] 這個數字有沒有位於索引值「a[i]」的位置。如果沒有的話,我們就將 a[i](當前數字)與 a[a[i]](位於 a[i] 這個位置的數字)交換,由此來達到類似排序的效果。

這樣掃完之後,只出現一次的數字必定會在自己應該在的位置、出現兩次的則會有其中一個在正確位置、另一個在別人的位置。

再掃過一次陣列然後比對 a[i] 是否等於 i ,如果找到一個 a[i] ≠ i 的則代表數字 i 沒有在陣列之中,所以將 i 放到儲存所求的陣列之中。過程結束之後,儲存用的陣列的內容即是所求。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

更多創作