目录
牛客_QQ2 微信红包
解析代码
牛客_QQ2 微信红包
微信红包_牛客题霸_牛客网
解析代码
本题很多思路,第一种排序思路,如果一个数出现次数超过一半了,排序过后,必然排在中间,则最后遍历整个数组查看是否符合即可。第二种思路可以用map统计每个数字出现的次数,最后判断有没有超过一半的数字。还可以用之前用过的摩尔投票法。
摩尔投票法,时间O(N),空间O(1),可以理解成混战极限一换一,不同的两者一旦遇见就同归于尽,最后活下来的值都是相同的,即要求的结果。(这种方法一般人都想不到,理解就行,以后遇到就会了)
class Gift {
public:
int getValue(vector<int> gifts, int n) {
int cnt = 0, ret = 0;
//for (int i = 0; i < n; ++i) // 摩尔投票法
//{
// if (cnt == 0)
// {
// ret = gifts[i];
// }
// else
// {
// ret == gifts[i] ? ++cnt : --cnt;
// }
//}
//cnt = 0;
sort(gifts.begin(), gifts.end());
ret = gifts[n / 2];
for (auto& e : gifts)
{
if (e == ret)
++cnt;
}
if (cnt > n / 2)
return ret;
return 0;
}
};