有m個數組成的陣列,其中有一個數佔一半以上,找出這個數
阿新 • • 發佈:2018-12-17
解法一:用快速排序,處於中間的數就是要找的那個數。時間複雜度為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)