如果一个数组A[1…n]中超过半数的元素都相同时,该数组被称为含有一个主元素。给定一个数组,设计一个有效算法,确定该数组中是否含有一个主元素。如果有,找出这个元素。该数组的元素之间不一定存在顺序,如整

题目三:

2.23如果一个数组A[1…n]中超过半数的元素都相同时,该数组被称为含有一个主元素。给定一个数组,设计一个有效算法,确定该数组中是否含有一个主元素。如果有,找出这个元素。该数组的元素之间不一定存在顺序,如整数之间就存在顺序,可以作形如"A[i]>A[j]吗"的比较与此不同的是,该数组中的元素则不一定能做出这样的比较。(比如可以把数组中的元素设想成
GIF文件)但是,却可以在常量时间内回答如下列形式的问题“A[i]>A[j]吗”
(1)给出一个算法,以0(nlogn)时间完成本题

算法思想:

根据主元素的定义与题目要求,由于不能比较A[i]与A[j]大小,所以就不可以用排序的方式进行寻找主元素,但是仍然可以比较元素之间相等与不相等,这里我采用删除数组中两个不相等的元素,主元素不变的思想,寻找主元素。

代码:

#include<iostream>
#include <vector>
#define INFINITY 100000
using namespace std;
int GetMain(vector<int>&A)
{
	int count = 0, mainE;
	for (int i = 0; i < A.size(); i++)
	{
		if (count == 0)
		{
			mainE = A[i];
			count = 1;
		}
		else
		{
			if (mainE == A[i])
				count++;
			else
				count--;
		}
	}
	if (count > 0)
		return mainE;
	else
		return INFINITY;
}
int main(void)
{
	vector<int>A;
	int n;
	cin >> n;
	for (int i = 0; i < n; i++)
	{
		int temp;
		cin >> temp;
		A.push_back(temp);
	}
	int temp = GetMain(A);
	if (temp != INFINITY)
		cout << "主元素为:" << temp;
	else
		cout << "没有主元素";
	system("pause");
	return 0;
}

测试案例:

在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

K_K_Chen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值