名企笔试:腾讯2016招聘笔试(微信红包)
题目描述
春节期间小明使用微信收到很多个红包,非常开心。在查看领取红包记录时发现,某个红包金额出现的次数超过了红包总数的一半。请帮小明找到该红包金额。写出具体算法思路和代码实现,要求算法尽可能高效。
给定一个红包的金额数组gifts及它的大小n,请返回所求红包的金额。
若没有金额超过总数的一半,返回0。
测试样例:
[1,2,3,2,2],5
返回:
2
分析:
找到出现一般的超过红包,就是找到超过一半的数,若没有超过一半的数就返回0。
想法一、排序,返回中位数,然后计算中位数的个数,如果超过一半就返回,否则返回0。时间复杂度是O(nlog(n))+O(n):排序+遍历一遍确定是否是超过一半的数。空间复杂度O(1)。
想法二、使用hash函数,计算每一个数出现的次数,然后便利hash表,返回个数超过一半的数。时间复杂度O(n);分别是计数+遍历hash表+验证。空间复杂度O(n)。
想法三、如果一个数出现次数超过一半,我们任意去掉两个不相同的数,剩下的数组中,仍然有一个数出现的次数是剩下数组的一半。假设出现一半的数是a,我们每次去掉两个不相同的数b和c。如果b!=a且c!=a,那么剩下的数然后是a超过剩余数组的一半。假