数据结构代码综合题 线性表 19-12

方法一:时间复杂度高O(n^2)

#include<bits/stdc++.h>
using namespace std;
int a[5]={2,5,6,8,9};
int b[5]={1,2,5,2,2};

int n=sizeof(a)/sizeof(a[0]);
int major(int a[],int n){
	int k=0;  //用于记录出现次数 
	//设a[i]为当前主元素 
	for(int i=0;i<n;i++){
		 for(int j=0;j<n;j++){
		 	if(a[i]==a[j]) k++; 
		 }
		 if(k>n/2) return a[i];
		 k=0;  //注意换主元素时要重置k 
	}
	return n-1;
}
int main(){
	//cout<<n<<" ";
	int t=major(b,n);
	cout<<t<<endl;
	return 0;
}

方法2:摩尔投票法。

时间复杂度O(n),空间复杂度O(1)

思路:一次遍历找到候选元素,一次遍历验证元素是否为主元素。

步骤一:找候选元素:

设候选元素c为数组第一个元素。count初始化为1(第一个元素已被考虑);

从数组第二个元素开始遍历,相同则count++;不同则:count>0时count--,直到count=0时,更新候选元素,并设count为1。

步骤二:验证候选元素:

重新遍历候选元素出现次数,大于n/2次则为主元素

#include<bits/stdc++.h>
using namespace std;
int b[5]={1,2,5,2,2}; 
int n=sizeof(b)/sizeof(b[0]);
int major(int a[],int n){
	int c=a[0],count=1;
	
	for(int i=1;i<n;i++){
		if(c==a[i])  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;

}

int main(){
	cout<<n<<" ";
	int result=major(b,n);
	cout<<result<<endl;
	return 0;}
	
	

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值