[英]Determine all duplicates in array of size n having values in range 0 to n-2 in O(1) space and O(n) time
[英]How to find a number that was repeated (n/3) times an array of size n, in O(n) time and O(n) space?
我有這個問題,我就是想不通! 任何提示都意味着很多。 先感謝您。 我有一個數組A
。 它的大小是n
,我想找到一個算法來找到至少出現在這個數組中n/3
次的x
。 如果數組中沒有這樣的 x,那么我們將打印出我們沒有找到一個! 我需要找到一種在O(n)
時間內完成此操作並占用O(n)
空間的算法。
例如:
A=[1 1 2 2 1 1 1 5 6 7]
對於上述數組,算法應返回1
。
如果我是你,我會寫一個算法:
n/3
,則將其打印出來。 處理找不到的情況等。這是我的偽代碼解決方案; 請注意,可以有兩種解決方案,也可以有一種或沒有:
func anna(A, n) # array and length
ht := {} # create empty hash table
for k in [0,n) # iterate over array
if A[k] in ht # previously seen
ht{k} := ht{k} + 1 # increment count
else # previously seen
ht{k} := 1 # initialize count
solved := False # flag if solution found
for k in keys(ht) # iterate over hash table
if ht{k} > n / 3 # found solution
solved := True # update flag
print k # write it
if not solved # no solution found
print "No solution" # report failure
第一個for
循環需要 O( n ) 時間。 如果數組中的所有項都是不同的,則第二個for
循環可能需要 O( n ) 時間,但大多數情況下,第二個for
循環將花費更少的時間。 如果數組中的所有項目都是不同的,則哈希表占用 O( n ) 空間,盡管大多數情況下它占用的空間要少得多。
如果沒有可能的解決方案,可以優化解決方案,使其提前停止並報告失敗。 要做到這一點,在第一個for
循環中保留一個變量max ,每次被新的哈希表計數超過時增加它,並在每個元素添加到哈希表后檢查是否max + n - k < n / 3。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.