算法时空-超过一半的众数问题

本文深入探讨了众数问题,即在一个集合中找到出现频率超过一半的数字,采用蓄水池思想进行高效求解。同时,文章还讨论了如何找出超过1/3频率的两个数,提供了详细的算法实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


1. 超过一半的众数问题

将一个集合里出现超过一半的次数的数叫众数,那么如果集合里一定存在众数的情况下,如何得出该数字呢?

  • 思路分析:利用众数出现次数过半,必然能和非众数一一抵消后依然留在所谓的“蓄水池”,所以,最后留在蓄水池的必然是众数;
int main() {
	
	int a[10] = {2,4,2,-7,5,2,2,2,-4,2};
	int l = 0, r = 9;
	findMostNum(a, l, r);
	return 0;
}

//蓄水池思想;
void findMostNum(int *a, int &l, int &r) {
	int num = 0; // 保留此时留存在蓄水池里的唯一数的频数
	int cur; // 唯一数
	for(int i=l; i<=r; ++i) {
		if(num == 0) { //若此时蓄水池为空
			cur = a[i]; //蓄水池存数
			num = 1;
		} else if(cur == a[i]) num ++;
		else num --;		
	}
	num = 0;
	for(int i=l; i<=r; ++i) {
		if(a[i] == cur) num ++;
	}
	if(num > (r - l + 1) / 2) printf("存在众数,为%d, 出现次数%d次\n", cur, num);
	else printf("不存在众数\n");
}

2. 超过1/3的两个数?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值