#算法# 递归法找多元素

找寻一组数中出现次数最多的数

  • 定义:数组a[n],整数x在数组a中出现的次数>(n/2),x即为多元素。
  • 算法思路:1.次数大于n/2,每次去掉2个数仍可满足。2.有选择性的统计出现次数

寻找出现次数大于n/2的数

三大要素:数组、查找位置、n

1.参数:Count    //重复+1,不重复-1
       Data[n]  //数据存储的地方
       locate   //寻数位置
2.思路:
       //初始化
       Count =1;
       temp =Data[1];
       //执行
       从Data[2]开始向后扫描,for i=2 to n
       if(Data[i]==temp) Count++;
       if(Data[i]!=temp) Count--;
       if(Count==0),对Data[i+1..n]再次寻找出现次数大于剩下数的一半的数
 3.算法
uint32_t Candidate(uint32_t *Data, int locate, int n)
{
    uint32_t temp = Data[locate];
    int i,count = 1;
    for(i = locate+1;i < n && count >0; i++){
        if(Data[i] == temp) 
            count++;
        else
            count--;
    }
    if(i == n)
        return temp;
    else 
        return Candidate(Data, i+1, n);
}

在这个算法中有一个重要的隐含的意思,由于找寻的是超过一半的数,那么在count记为0时,拿掉之前的数,剩下的数据中超过一半的数即是整体数中超过一半的数。

判断寻找到的数是否符合要求

int Majority(uint32_t *Data, int n)
{
    uint32_t temp= Candidate(Data, 1, n);
    int i,count;
    for(i=1; i<=n; i++){
        if(Data[i] == temp)
            count++;
        if(count > n/2)
            return temp;
        else
            return -1;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值