例题:
有一个记录商品的管理表,记录商品的id。arr[i]就表示商品的id。商品id可能会重复
返回管理表中数量大于商品总数一半的id。
例如:arr = {0, 1, 2, 3, 4, 5};
摩尔投票法:
主要思想在于票数抵消。
可以得出两点推论:
- 每次发现出现次数最多的id的票为+1,其他的票为-1 。那么所有票加起来的总和肯定大于0
- 如果前面n个id的票数和为0,则剩下的id的票数和肯定依旧大于0
通俗来理解,在一个卡牌对战游戏里,有很多队伍,你的队伍拥有的卡数大于总卡数的一半。不同队伍的两张卡可以抵消。假如你有7张卡,其他人一共有3张卡,对战之后,你还剩4张卡。获胜的一定是卡最多的人。不论是其他队伍的人互相对战,还是你的队伍对战所有队,剩下的一定是你的队伍,因为你的卡数超过了一半。
int Test(vector<int>& stock)
{
int x = 0, votes = 0;
for(int num : stock)
{
if(votes == 0)
{
x = num;
}
votes += num == x ? 1 : -1;
}
return x;
}