Weiss-(DSAA - in C,2.19) 大小为N的数组A,其主要元素出现次数超过N/2

本文介绍了一种用于查找数组中出现次数超过一半的主要元素的算法。该算法通过递归构造辅助数组来逐步缩小搜索范围,最终确定主要元素。文章还详细解释了关键步骤的逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*
  大小为N的数组A,其主要元素是一个出现次数超过N/2的元素(这样的元素只有一个)
  算法概要:
    第一步:
    找出主要元素的一个候选元(这是难点)。这个候选元是唯一有可能是主要元素的元素。
    第二步:
    确定是否这个候选元是主要元素。
    
    为了找出候选元,构造第二个数组B。
    比较A1和A2,如果它们相等则取其中之一加到数组B中;否则什么都不做;
    然后比较A3和A4,按同样的方式处理,其次类推直到读完这个数组,
    然后递归的寻找数组B中的候选元,它也是A的候选元. (为什么?)
    
    a, 递归如何终止?
    b, 当N是奇数时, 如何处理?
    c, 该算法的运行时间是多少?
    d, 我们如何避免使用附加数组B?
    e, 编写一个程序求解主要元素.

*/


int findMainNum(vector<int> &A)
{
    vector<int> B;                        //候选数组
    if(A.empty())
        return -1;
    else if(A.size() == 1)
        return A[0];

    for(int i = 0; i < A.size(); i += 2)
        if(A[i] == A[i+1] && i+1 < A.size())
            B.push_back(A[i]);
  
    int res = findMainNum(B);            //递归,将问题规模缩小

   if(isMainNum(A,res))
        return res == -1? A.back() : res;   /* 1*/
    else
        return -1;                        //没有找到这样的元素
}


bool isMainNum(vector<int> &A,int res) 
{
    int count = 0;
    int s = res == -1? A.back() : res;    //有候选元素使用res,无就使用最后一个元素  /* 2*/   
<pre name="code" class="cpp">   
    for(int i = 0; i < A.size(); i++)
if(A[i] == s) count++; if(count >= A.size()/2 + 1) return true; else return false;}


解释一下 : /* 1*/ 和  /* 2*/
/*
      若isMainNum(A,res)为真
      则有两种情况:
      1.res == -1 ,无候选元素,此时应返回 A[]最后一个元素, s = A.back();
      2.res != -1 ,有候选元素,此时应返回 res,  s = res;

*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值