题意:查找数列中出现次数超过或等于一半(n/2)的元素。
思想:序列中去掉两个不同的元素后,多数元素仍然是多数元素(可以想象成抵消)。不断递归就能解决。
时间复杂度:O(n),空间复杂度:T(n)
题目来源:学校内的某次课。
#include <iostream>
#include <cstdio>
using namespace std;
int candidate(int a[], int n, int m) // n表示序列长度,m表示查找起点
{
int j = m;
int c = a[m];
int count = 1;
while((j < n) && count > 0)
{
j ++;
if(a[j] == c)
count ++;
else
count --;
}
if(j == n)
return c;
else
return candidate(a, n, j + 1);
}
void find_many_num()
{
int a[] = {1, 2, 2, 4, 2, 3, 2};
int len = sizeof(a);
int c = candidate(a, len, 0);
int count = 0;
for(int i = 0; i < len; i++)
{
if(a[i] == c)
count ++;
}
if(count > (len / 2))
printf("存在多数元素为a:%d", c);
else
printf("不存在多数元素!");
}
int main()
{
find_many_num();
return 0;
}
这个是不是应该放在题解栏啊……大佬您说呢……
呃。。。