求解众数
投票算法:类似于配对,即对于一群人,我们希望知道男的多还是女的多,我们不需要知道多少名男多少名女,而是让一男一女配对,成对的男女离场,看最后场中剩下的是男还是女。
该问题可以理解为数组nums中相同的元素组成各自的队伍,maj所在的队伍人数最多,每个队伍都只支持自己所在的队伍,反对其他所有的队伍。当赞成和反对某个队伍的人数相同时,我们可以让这些赞成者和反对者组合离场,然后随机选取一个队伍在进行这样的配对和离场。
众数maj所在的队伍人数是大于总人数的一半的,不管怎样配对maj最后一定会被剩下,所以每次随机选取队伍进行“赞成该队伍”和“反对该队伍”的配对清场,不会影响maj队伍人数上的霸权地位。
int majorityElement(vector<int>& nums) {
int candidate = -1;
int count = 0;
for (auto num : nums) {
if (num == candidate)
count++;
else if (--count < 0) {
candidate = num;
count = 1;
}
}
return candidate;
}