题目:一个数组中有一个数字的次数超过了数组的一半,求出这个字符。如:int a[]={2,3,2,2,2,2,2,5,4,1,2,3},求出超过一半的数字是2
由题目可知,这个数字出现的次数,比其他所有数字出现次数之和还要大,所以在遍历时可以保存两个值,一个是里面的数字,一个是出现的次数。
情况:
1)如果下一个数字和保存的数字相同,次数加1
2)如果下一个数字和保存的数字不同,次数减1
3)如果次数为0,把保存的数字换成下一个
这样,最后保存的数字一般就是出现次数最多的,当然还需要检验一下,放止特殊情况干扰结果。
static bool CheckNum(int *numbers, int length, int number)
{
int times = 0;
for (int i = 0; i < length; ++i){
if (numbers[i] == number)
times++;
}
if (times * 2 <= length)
return false;
return true;
}
int MoreThanHalfNum(int *numbers, int length)
{
int flag = 1;
int ret = numbers[0];
for (int idx = 0; idx < length; ++idx){
if (flag == 0){
ret = numbers[idx];
flag = 1;
}
else if (numbers[idx] == ret)
flag++;
else
flag--;
}
if (CheckNum(numbers, length, ret))
return ret;
return 0;
}
本文介绍了一种高效算法,用于从数组中找出出现次数超过一半的数字。通过遍历数组并利用计数技巧,该算法能在O(n)时间内找到目标元素,并通过验证确保正确性。
507

被折叠的 条评论
为什么被折叠?



