算法解释:
想象着这样一个画面:会议大厅站满了投票代表,每个都有一个牌子上面写着自己所选的候选人的名字。然后选举意见不合的(所选的候选人不同)两个人,会打一架,并且会同时击倒对方。显而易见,如果一个人拥有的选票比其它所有人加起来的选票还要多的话,这个候选人将会赢得这场“战争”,当混乱结束,最后剩下的那个代表(可能会有多个)将会来自多数人所站的阵营。但是如果所有参加候选人的选票都不是大多数(选票都未超过一半),那么最后站在那的代表(一个人)并不能代表所有的选票的大多数。因此,当某人站到最后时,需要统计他所选的候选人的选票是否超过一半(包括倒下的),来判断选票结果是否有效。
面试题 17.10. 主要元素
数组中占比超过一半的元素称之为主要元素。给定一个整数数组,找到它的主要元素。若没有,返回-1。
class Solution {
public:
int majorityElement(vector<int>& nums) {
int target = nums[0];
int count = 1;
for (int i=1; i<nums.size(); ++i) {
if (count == 0) {
target = nums[i];
count = 1;
} else {
if (nums[i] != target) {
--count;
} else {
++count;
}
}
}
if (count == 0) {
return -1;
}
count = 0;
for (int i = 0; i<nums.size(); ++i) {
if (nums[i] == target) {
++count;
}
}
return (count > (nums.size()/2)) ? target : -1;
}
};