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

来源:互联网 发布:小米快盘数据迁移 编辑:程序博客网 时间:2024/06/03 18:36

代码:

#include <iostream>#include <random>using namespace std;int RandomRange(int start, int end){    uniform_int_distribution<int> u(start, end);    default_random_engine e;    return u(e);}int Partition(int data[], int length,int start, int end)    //随机快速排序{    if (data == nullptr || length <= 0 || start < 0 || end >= length)        throw new exception("Invalid parameters");    int index = RandomRange(start, end);    //随机选择一个索引    swap(data[index], data[end]);    int small = start - 1;    for (int index = start; index < end; ++index)    {        if (data[index] < data[end])        {            ++small;            if (small != index)                swap(data[small], data[index]);        }    }    ++small;    swap(data[small], data[end]);    return small;}int MoreThanOneHalfNumber(int *data, int length){    int start = 0, end = length - 1;    int mid = (start + end) / 2;    int index = Partition(data, length,start, end);    while (index != mid)    {        if (index < mid)        {            start = index + 1;            index = Partition(data, length,start, end);        }        else        {            end = index - 1;            index = Partition(data,length, start, end);        }    }    return  data[mid];}bool checkMoreThanHalf(int* data, int length, int number){    int times = 0;    for (int i = 0; i < length; i++)    {        if (data[i] == number)            ++times;    }    if (2 * times <= length)        return false;    else        return true;}int main(){    int data[] = { 1, 2, 3, 2, 2, 2, 5, 4, 2 };    int length = sizeof(data) / sizeof(data[0]);    int result = MoreThanOneHalfNumber(data, length);    cout << "数组中出现次数超过一半的数字: " << result << endl;    cout << boolalpha<<checkMoreThanHalf(data, length,result)<< endl;    cout << endl;    system("pause");    return 0;}

测试:

这里写图片描述

解法二:

这里写图片描述

代码:

int MoreThanOneHalfNumber(int* data, int length){    if (data == nullptr || length <= 0)        throw new exception("Invalid Parameters");    int result = data[0];    int times = 1;    for (int i = 1; i < length; i++)    {        if (data[i] == result)        {            times++;        }        else if (times == 0)        {            result = data[i];            times++;        }        else        {            times--;        }    }    return result;}
0 0
原创粉丝点击