簡體   English   中英

如何在 O(n) 時間和 O(n) 空間中找到重復 (n/3) 次大小為 n 的數組的數字?

[英]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

如果我是你,我會寫一個算法:

  1. 以您使用的任何語言實例化映射(即鍵/值對)。 鍵將是您找到的整數,值將是到目前為止它被看到的次數。
  2. 遍歷數組。 對於當前整數,檢查該數字是否作為映射中的鍵存在。 如果存在,則增加地圖的值。 如果它不存在,則插入一個計數為 1 的新元素。
  3. 迭代完成后,迭代您的地圖。 如果任何元素的計數大於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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM