#include <stdio.h>
using namespace std;
/*
给一个数组求主元素
根据题意可知题目中表达的主元素就是值当同一个值的个数大于整体个数的一半时那么这个数就是主元素
1.算法思想
可以设计一个变量count先把第一个数当主元素
往后遍历如果相同就count++
如果不同count--
如果count小于了0
就把当前比较的数当做主元素
继续遍历 最后还有一个统计这个数是否大于整体数量的1/2的比较
如果是就返回主元素
如果不是就返回-1
2.代码实现
3.时间空间复杂度分析
时间复杂度为O(n)
空间复杂度为O(1)
*/
int mainElem(int a[],int n){
int count=0;
int x=a[0];
for(int i=1;i<n;i++){
if(x==a[i]){
count++;
}else{
count--;
if(count<0){
x=a[i];
count = 0;
}
}
}
printf("x=%d\n",x);
printf("count=%d\n",count);
int k=0;
if(count>=0){
for(int i=0;i<n;i++){
if(a[i]==x){
k++;
}
}
printf("k=%d\n",k);
if(k>n/2){
return x;
}else{
return -1;
}
}
}
int main(){
int n=8;
int a[n]={0,5,5,3,5,1,5,5};
int t=mainElem(a,n);
if(t==-1){
printf("没有主元素");
}else{
printf("主元素为:%d",t);
}
}