(此题重点!!!)已知一个整数序列 A =(a 0 ,a 1 ,..., a n-1 ),找出 A 的主元素

问题描述

已知一个整数序列 A =(a 0 ,a 1 ,…, a n-1 ) , 其中0≤ai<n(0≤i<n)。 若存在a p1 =a p2 =…=a pm =x且m>n/2(0≤p k <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是否为主元素。
算法分为两步:
一、选取候选的主元素。依次扫描数组中的每一个整数,将遇到的第一个整数Num保存到c中,记录Num的出现次数为1;若遇到下一个整数仍等于1,计数加1,否则计数减1;当计数减到0时,将遇到的下一个整数保存到c中,技术重新记为1,开始新一轮计数。
二、判断c中元素是否是真正的主元素。再次扫描该数组,统计c中出现的次数,若大于n/2,则为主元素;否则,序列中不存在主元素。

源代码

#include<iostream>
using namespace std;
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){
		for(i=count=0;i<n;++i){
			if(A[i]==c);
				count++;
		}
	}
	if(count>n/2)
		return c;
	else
		return -1;
}

int main()
{
	int n;
	cin>>n;
	int A1[n];
	for(int i=0;i<n;++i){
		cin>>A1[i];
	}
	cout<<majority(A1,n);
	return 0;
} 

执行结果

在这里插入图片描述

发布了28 篇原创文章 · 获赞 0 · 访问量 933
展开阅读全文

关于递归求解问求教.寻找递归大神!

11-30

【问题描述】   已知一个一维数组A[1..N](N<50),又已知一整数M。 如能使数组A中任意几个元素之和等于M,则输出YES,反之则为NO。(要求用递归函数编写程序) 【输入样例】   5   1 2 3 4 5   12 【输出样例】   YES 我的想法是分成两部分,数组中的每一个数都存在选和不选的可能,由此递归。我写了两个递归程序,一个是错的,一个是对的,我不明白错的为什么错了,因为思路和正确的代码是一样的,求大神解答。 --------------------------------------以下是正确的------------------------------- #include <iostream> #include <cstdio> #include <vector> #include<string> using namespace std; int m; int n,in[100]; int flag=0; void pd(int in[],int n,int k) { if(in[n]==k) { flag=1;return ; } else if(n==0) return ; else { pd(in,n-1,k); pd(in,n-1,k-in[n]); } } int main() { cin>>n; for(int i=0;i<n;i++) { cin>>in[i]; } cin>>m; pd(in,n-1,m); if(flag) cout<<"yes"<<endl; else cout<<"no"<<endl; return 0; } --------------------------------------以下是错误的------------------------------- #include <iostream> #include <cstdio> #include <vector> #include<string> using namespace std; int m; int n,in[100]; int flag=0; void pd(int in[],int n,int k,int sum) { if(sum==k) { flag=1;return ; } else if(n==0) return ; else { pd(in,n-1,k,sum); pd(in,n-1,k,sum+in[n]); } } int main() { cin>>n; for(int i=0;i<n;i++) { cin>>in[i]; } cin>>m; pd(in,n-1,m,0); if(flag) cout<<"yes"<<endl; else cout<<"no"<<endl; return 0; } ---------------------------------------------以上是代码-------------------------- 求大神解答,我还想知道这个递归的时间复杂度,不知道该怎么计算,O(n!),O(2^n)? 问答

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 1024 设计师: 上身试试

分享到微信朋友圈

×

扫一扫,手机浏览