1. 程式人生 > >有m個數組成的陣列,其中有一個數佔一半以上,找出這個數

有m個數組成的陣列,其中有一個數佔一半以上,找出這個數

解法一:用快速排序,處於中間的數就是要找的那個數。時間複雜度為O(nlogn)

快排的python實現可以點選這

解法二:統計每個元素出現的次數,返回出現次數最大的元素。不同元素個數為M,則時間複雜度為O(M*n)

aa = [1,1,1,1,0,0,0,0,0]
set_aa = list(set(aa))
count_max = 0
key = 0
for item in set_aa:
    count = 0
    for i in aa:
        if i == item:
            count += 1
        if count > count_max:
            count_max = count
            key = item
print(key)
print(count_max)

解法三:遍歷元素,將每個元素和對應的個數用鍵值對的形式儲存,再選擇出鍵值對中值最大的鍵。不同元素個數為M,時間複雜度為O(n)+O(M)

aa = [1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3]

dict_ = {}
for i in aa:
    if i not in dict_.keys():
        dict_[i] = 0
    dict_[i] += 1

max_value = 0
max_key = 0
for j in dict_:
    if dict_[j] > max_value:
        max_value = dict_[j]
        max_key = j
        
print(max_key)
        

解法四:因為某個元素佔一半以上,故採用抵消的方式,抵消完畢,此元素至少還剩一個

遍歷元素,定義變數key和count,

key首先指向第一個元素,count為1,

將key與後面的元素比較,相同則count += 1,否則count -= 1

當count == 0,key替換

時間複雜度O(n)

aa = [1,1,1,0,0,2,0,0,0]

key = aa[0]
count = 1
for i in range(len(aa)-1):
    if key == aa[i+1]:
        count += 1
    else:
        count -= 1
        if count == 0:
            key = aa[i+2]
print(key)