题目:
在一个数组中找出重复出现次数超过数组长度一半的数。
类似众数
起初,立马想到使用map记录,这样能达到O(n)的时间复杂度。但是空间开销比较大。
后来看到另外一种比很实用的算法----摩尔投票算法
其基本思路是:(伪代码形式)
for e : nums
if count == 0 //初始时
max = e;
else
//同加异减
if max == e //当前相等则不会出局
count++
else
count--; //类似于在数组中删除该位置的值。即将其投票出局
附上代码:
static public int majorityElement1(int[] nums) {
int count = 0;
int max = nums[0];
for(int e : nums) {
if(count == 0) {
count++;
max = e;
}else {
if(max == e)
count++; //增加
else
count--; //相当于删除操作:在数组中删除与当前的max数值相等的一个位置
}
}
return max;
}