己知这个数比50多70%求这个数。

要求O(n)时间复杂度。
利用“已经知道这个数字在整个数组中出现的比例超过50%”这个事实,采用计数法。
设置两个变量:number表示在遍历过程中出现次数最多的数,flag表示在遍历过程中该数字出现的次数与其他数字出现次数之差。初始化flag为0。
从头遍历数组,首先判断flag是不是为0,如果为0,则number记为当前遍历的数,并且flag++,继续向下遍历(此处需要说明的是,flag为0表示现在尚没有找到某个数次数比别人都多的)
若flag不等于0,那么说明前边有一个数number可能是最后答案,此时将该number与遍历位置上的数字进行比较,相等flag++,不等flag—。
这样遍历完最后得到的number即为所求,此时flag表示出现超过一半的这个数比其余数字多的次数,利用这个数字也可以得到这个出现次数超过一半的数究竟出现了几次,即(SIZE+flag)/2。
实现如下:
* =====================================================================================
exceedhalf.cpp
Description:
Find out which number exceeds the half of a array
04/22/:24 AM
gnuhpc (http://blog.csdn.net/gnuhpc),
* =====================================================================================
18: #include &iostream&
19: #include &../include/utils.h&
21: #define NUMBER 10
22: using namespace
24: void findOutHalf(const int* array);
26: int main(int argc, char *argv[])
int *array = new int[NUMBER];
while(i&NUMBER){
cin && array[i++];
findOutHalf(array);
37: void findOutHalf(const int* array){
cout && &===========& &&
int flag = 0;
for( int i = 0 ; i&NUMBER ; ++i )
if( flag == 0 )
number = array[i];
( number == array[i])?(++flag):(--flag);
cout && number &&
cout && flag &&
阅读(...) 评论()}

我要回帖

更多关于 已知平均值求随机数 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信