算法实现题 2-2 众数问题

算法实现题 2-2 众数问题

问题描述:

给定含有 n 个元素的多重集合 S,每个元素在 S 中出现的次数称为该元素的重数。多重
集 S 中重数最大的元素称为众数。
例如,S={1,2,2,2,3,5}。
多重集 S 的众数是 2,其重数为 3。

编程任务:

对于给定的由 n 个自然数组成的多重集 S,编程计算 S 的众数及其重数。

数据输入:

输入数据由文件名为 input.txt 的文本文件提供。
文件的第 1 行多重集 S 中元素个数 n;接下来的 n 行中,每行有一个自然数。

结果输出:

程序运行结束时,将计算结果输出到文件 output.txt 中。输出文件有 2 行,第 1 行给
出众数,第 2 行是重数。

输入文件示例

6 1 2 2 2 3 5

输出文件示例

2 3

AC

考虑了有多个众数的情况,全部输出

#include<bits/stdc++.h>
using namespace std;

struct stu {
    
    
	int n;
	int num;
} stu[100];
int p=0;
/*
一组数据中,众数可以有一个或多个,这个时候需要全部记录下来
建立结构体数组的目的就是为了记录众数 
*/

int main() {
    
    
	int n;
	cout<<"请输入全部数字的个数:\n";
	cin>>n;
	int a[n],b[n]= {
    
    0};
	cout<<"输入全部数字:\n";
	for(int i=0; i<n; i++) {
    
    
		cin>>a[i];
		b[a[i]]++;
	}
	int max=0;
	for(int i=0; i<n; i++) {
    
    
		if(b[i]>=max) {
    
    
			if(b[i]>max)
				p=0;
			stu[p].n=i;
			stu[p++].num=b[i];
			max=b[i];
		}
	}
	for(int i=0; i<p; i++)
		cout<<stu[i].n<<" : "<<stu[i].num<<endl;
	return 0;
}

分治策略

众数问题(分治法解决)

#include<bits/stdc++.h>
using namespace std;

int n;
int num=0,v;//全局变量,表示众数的个数和众数
int a[999];//存储数据 

void fun(int left,int right) {
    
    
	if(left>right)
		return ;
	int mid=(right+left)/2;//取中位数 
	int i=mid,j=mid;
	while(i>=0&&a[i]==a[mid])
		i--;
	while(a[j]==a[mid]&&j<=n-1)
		j++;
	if(j-i-1>num) {
    
    
		num=j-i-1;//中位数的个数 
		v=a[mid];
	}
	// i-left+1 中位数左边还有多少数字 如果大于num 则众数可能位于左边 
	if(i-left+1>num)
		fun(left,i);
	// right-j+1 中位数右边还有多少数字 同上 
	if(right-j+1>num)
		fun(j,right);
}

int main() {
    
    
	cout<<"请输入全部数字的个数:\n";
	cin>>n;
	cout<<"输入全部数字:\n";
	for(int i=0; i<n; i++) {
    
    
		cin>>a[i];
	}
	sort(a,a+n);
	fun(0,n-1);
	cout<<v<<" : "<<num<<endl;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_45745322/article/details/114994017
2-2
今日推荐