查找数组中出现次数超过数组长度一半的数字

这篇博客讨论了如何在数组中找到出现次数超过数组长度一半的数字。提供了两种解决方案:一种是使用快速排序思想,找到中位数;另一种是通过遍历数组,记录数字及其出现次数,最终找到超过一半次数的数字。这两种方法的时间复杂度均为O(n)。
摘要由CSDN通过智能技术生成

题目:
数组中一个数字出现的次数超过数组长度的一半,请找出这个数字。
例如:
输入一个长度为9的数组{1,2,3,2,2,2,5,4,2},由于2出现的次数为5次,超过数组的一半,因此输出的结果是2。
我们可以这样考虑:
有如下解法:
方案一:
考虑一下,如果某数出现的次数大于数组长度的一半,那么若我们将数组中所有数字排序的话,中间的数肯定就是要求的数。我们用快排。
随机选中一个数字key,排序后再Key左边的数字都比key小,在key右边的数字都比key大。有关快排解释详情见[链接]。(https://blog.csdn.net/baidu_37964071/article/details/79439679)
如果选中的数在的下标刚好是第n/2的数字,那么这个数字就是中位数.如果下标大于n/2,那么中位数,在它的左边,如果下标小于n/2,那么中位数在它右边.这是一个典型的递归算法。
时间复杂度为O(n)。
下面是代码:

//快排
int Partition(int *array, int length, int left, int right)
{

    int key = array[right];
    while (left < right)
    {
        if (left < right&&array[left] <= key)
        {
            ++left;
        }
        array[right] = array[left];
        if (left < right&&array[right] >= key)
        {
            --right;
        }
        array[left] = array[right];
    }
    array[left] = key;
    return left;
}
//考虑非法输入
bool CheckInvalidArray(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值