相关概念
- 投票和:由于数组中所要寻找的众数大于数组的一般长度,所以如果记跟众数x相等的数票数为+1,不等的为-1,那么最后的总和票数一定是大于0的;
- 票数正负抵消:如果出现了前i个数的投票和为0,那么数组中剩下的部分的投票和一定会大于0;
算法构建
- 首先设置数组中第一个数为众数x,那么发生正负抵消时:
* 如果x为真正的众数,那么抵消的这部分中众数与非众数五五开,则剩下的部分一定是存在大于0的投票和
* 如果x不为真正的众数,那么抵消的这部分中众数小于或等于一半,那么剩下的部分也一定是存在大于0的投票和
- 可以可用正负抵消的特性,逐步压缩范围,直到遍历完数组找到令最终投票和大于0的那个数,返回即可
代码
public int majorityElement(int[] nums) {
int val = nums[0];
int all = 1;
for(int i = 1;i<nums.length;i++){
if(all==0){
val = nums[i];
all = 1;
continue;
}
if(nums[i]!=val)all -= 1;
if(nums[i]==val)all += 1;
}
return val;
}