标签:算法 扫描 str 使用 pre 复杂 其他 计数 实现
问题(2013 统考408真题):已知一个整数序列A = (a0,a1,...,an-1), 其中0≤ai≤n (0≤i<n)。若存在ap1=ap2...=apm=x且m>n/2 (0≤pk≤n,1≤k≤m),则称x为A的主元素。例如,A=(0,5,5,3,5,7,5,5),则5为主元素,又如A=(0, 5, 5,3, 5, 1, 5,7),则A中没有主元素。假设A中的n个元素保存在一个一维数组中, 请设计一个尽可能高效的算法,找出A的主元素。若存在主元素,则输出该元素:否则输出-1。
num
计数,确定其是否为主元素。num
保存到c
中,用count
记录num
出现的次数,初始时令count = 1
。如果下一个遇到的元素仍然是num
则将count
加1
,否则将count
减1
。如果此时count == 0
,则将下一个元素保存到c
中,并重置count
为0
。重复上述过程,直至扫描完全部元素。c
是否为真正的主元素。统计c
出现的次数,并保存到count
中,如果count > n / 2
,则是主元素,否则不是。n / 2
。count
进行计数时,当count == 0
时,一定有偶数个的元素与可能的主元素进行了比较,这偶数个元素中一半是可能的主元素,另一半是其他数。T(n) = O(n)
, S(n) = O(1)
。int Majority(int A[], int n)
{
int i, c, count = 1;
c = A[0];
for (i = 1; i < n; i++)
{
if (A[i] == c)
{
count++;
}
else
{
if (count > 0)
{
count--;
}
else
{
c = A[i];
count = 1;
}
}
}
if (count > 0)
{
count = 0;
for (i = 0; i < n; i++)
{
if (A[i] == c)
{
count++;
}
}
}
if (count > n / 2) return c;
else return -1;
}
标签:算法 扫描 str 使用 pre 复杂 其他 计数 实现
原文地址:https://www.cnblogs.com/adios/p/12609036.html