摩尔投票算法
参考:如何理解摩尔投票算法? - 喝七喜的回答 - 知乎
https://www.zhihu.com/question/49973163/answer/235921864
思路
数组中出现次数超过一半的数字最多只有一个,题目是有解的,所以数组中出现次数超过一半的数字有一个。依次将数组中两个不相同的数字抵消,最后剩下的未被抵消的一个或几个数字就是要找的数。
遍历中的三种情况如下:
1.count=0:如果没有数字用来抵消(flag是用来抵消的数字),那么将当前数字设为可用来抵消的,同时令count=1。
2.num=flag:当前数字跟用来抵消的数字相等,这次不能抵消,将count+1。
3.num!=flag:当前数字跟用来抵消的数字不相等,这两个数字抵消,count-1,flag暂时不改变。
代码
public int majorityElement(int[] nums) {
int flag=0;
int count=0;
for(int num:nums){
if(count==0){
flag=num;
count++;
continue;
}
if(num==flag){
count++;
continue;
}
else{
count--;
}
}
return flag;
}
}
复杂度
时间复杂度O(n) 空间复杂度O(1)