编程题——有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)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值