簡體   English   中英

發現主要元素出現超過n / 3次

[英]find major elements appears more than n/3 times

對於一些測試用例,在解決方案下面進行下面的算法拼圖和調試工作。 我的困惑和疑問是,我們怎樣才能始終保證元素的計數出現超過n / 3次有正數? 還有另外2n / 3個元素可以使它數為負數? 但我試過,它總是在我的樣本中工作。 如果有人可以幫助澄清,那將是偉大的。

這是問題陳述和我的代碼/測試用例,

給定大小為n的整數數組,找到所有出現超過⌊n /3⌋次的元素。 算法應該在線性時間和O(1)空間中運行。

def majorityElement(nums):
    if not nums:
        return []
    count1, count2, candidate1, candidate2 = 0, 0, 0, 0
    for n in nums:
        if n == candidate1:
            count1 += 1
        elif n == candidate2:
            count2 += 1
        elif count1 == 0:
            candidate1, count1 = n, 1
        elif count2 == 0:
            candidate2, count2 = n, 1
        else:
            count1, count2 = count1 - 1, count2 - 1
    return [n for n in (candidate1, candidate2) if nums.count(n) > len(nums) // 3]

if __name__ == "__main__":

    # print majorityElement([1,2,1,3,1,5,6])
    print majorityElement([2,3,1,2,1,3,1,5,5,1,6])

林先生,提前謝謝

從概念上講,我們重復對列表中應用縮減操作,該操作涉及刪除三個成對不同的項目。 這個特殊的代碼在線進行減少,因此到目前為止減少的列表可以用兩個不同的元素及其相應的計數來描述(因為如果有第三個元素與其他兩個元素不同,那么我們可以減少)。 最后,我們考慮最多兩個元素發生超過n / 3次。

正確性證明的有趣部分是一個引理,無論何時我們執行此減少操作,在舊列表中發生更多n / 3次的任何元素在新列表中發生的次數超過n'/ 3次,其中n是長度舊列表和n'= n-3是新列表的長度。 這通過歸納確保最終列表包含在初始列表中出現超過n / 3次的所有元素(但當然最終列表僅包含兩個不同的元素)。

引理的證明是,如果一個項目在舊列表中出現n次k次,則最壞的情況是在新列表中出現n-3次k-1次,並且如果k / n> 1/3 , 然后

              (k-1) n
(k-1)/(n-3) = -------
              (n-3) n

              k (n-3) + 3 k - n
            = -----------------
                   (n-3) n

                      (k/n - 1/3)
            = k/n + 3 -----------
                          n-3

            > 1/3.

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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