解法一:用快速排序,处于中间的数就是要找的那个数。时间复杂度为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)