求数组中出现次数超过一半的数字

来源:互联网 发布:linux make 退出 编辑:程序博客网 时间:2024/05/22 16:44

思路和代码参考《程序员编程艺术》第二十一章“发帖水王”及其扩展。

求一个数组中出现次数超过一半的数字。比如有一个数组arr[] = {2,1,3,2,2,1,4,2,2,2},这个数组中出现次数超过一半的数字就是2。

思路: 数组中有有个数字出现次数超过一半,也就是说,有个数字出现的次数比其他数字出现的次数的和还要多。我们可以在遍历数组时保存两个值,一个是数组中的数字,一个是该数字出现的次数。当我们遍历下一个元素时,如果下一个数字和我们之前保存的数字相同,那么次数加1,如果不同,则次数减1,当次数为0时,将保存的数字重置。

int Find(int* a, int sz){    int number;    int times, i;    for (i = times = 0; i < sz; i++)    {        if (times == 0)        {            number = a[i];            times = 1;        }        else        {            if (number == a[i])            {                times++;            }            else            {                number = a[i];                times--;            }        }    }    return number;}int main(){    int arr[] = { 2, 1, 3, 2, 2, 1, 4, 2, 2, 2 };    int sz = sizeof(arr) / sizeof(arr[0]);    int ret = Find(arr, sz);    cout << ret << endl;    system("pause");    return 0;}

这里写图片描述

原创粉丝点击