//数组中某个元素出现次数超过了数组长度的一半,找出这个元素
思路1,先排序再返回数组N/2的元素,算法复杂度是nlgn
思路2, 顺序统计主元的思想,可以达到o(n)级别的复杂度
思路3,消除法 定一个候选值,和次数变量,如果和候选值一样
就次数加1,如果不一样,新的后选址加1,最后返回次数不为0的那个
searchValue(A):
int candicate = A[0]//候选值
int times=1//出现的次数,原始次数为1,不是0
len = A.length
for (int i =1;i<len-1; i++)
{
if(nTimes ==0)
{
candicate = A[i];
nTimes =1;
continue;
}
if (A[i] == candicate)
{
nTimes++;
}
else
nTimes--;
}
print candidate
}
//数组中某个元素出现次数恰好为一半,找出这个元素
思路:排序算法不好用,不知道返回哪个元素。
水王恰好为一半,说明总数为偶数
不失一般性,假设隔一个数就是水王id,两两不同最后一定会消减为0
1,水王可能是最后一个元素 每次扫描多一个动作和最后一个元素比较,单独计数为N/2
2,水王不是最后一个元素,计数不足一半去掉最后一个元素,水王就是那个candidate
伪代码如下:
search(A):
int candidate = A[0]
int ntimes = 1;
N=A.length
int countOfLast = 0;//统计最后元素出现的次数
for (int i=1;i<N;i++)
//增加和最后一个元素比较的步骤
if (A[i] == A[N-1])
countOfLast++;
if (ntimes == 0)
candidate = A[i]
ntimes=1;
countinue
if (A[i]==candicate)
nTimes++;
else
nTimes--;
if countOfLast ==N/2:
return A[N-1]
else
print candidate