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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/rebornyp/article/details/86064676


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的两个数?

猜你喜欢

转载自blog.csdn.net/rebornyp/article/details/86064676