版权声明:本文为博主原创文章,未经博主允许不得转载。 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");
}