求序列主元素(时间复杂度为O(n))

80 阅读1分钟

方法一 桶排序

#include<iostream>
using namespace std;
int main(){
	int a[100],b[100]={0},i=0;
	while(1){
	int t;
	cin>>t;
	if(!t) break; 
	a[i]=t;
	b[a[i]]++;
	i++; 
	}
	int flag=0;
	for(int j=0;j<i;j++){
		if(b[a[j]]>i/2){
			cout<<a[j];
			break; 
		}
		else flag++;
	}
	if(flag==i) cout<<"-1";
	return 0; 
}

方法二 利用数学进行分析优化

int ans(int A[],int n){
    int i,c,count=1;
    c=A[0];
    for(int i=1;i<n;i++){
        if(A[i]==c)
            count++;
        else 
            if(count>0)
                count--;
            else{
                c=A[i];
                count=1;
            }
    }
    count=0;
    for(int i=0;i<n;i++){
        if(A[i]==c)count++;
    }
    if(count>n/2) return c;
    else return -1;
}