百度笔试题,求数组最大数,该数为数组中某两个数相加

题目来源:http://bbs.csdn.net/topics/390885270

题目:在一个正整数集合S中,找出一个最大数C,使得C=A+B,其中A和B也是S种的元素。。。

首先,我们将数组从小到大进行快速排序,

1、将最后一个数设为最大数S;

2、用第一个数A和倒数第二个数B相加,如果结果比S大,说明B太大了,那么移动为倒数第三个数;如果比S小,说明A太小了,移动为第二个数。如果相等,直接返回A,B

3、直到AB的索引相遇还找不到结果与S一样的,将S变为倒数第二个数,再循环进行以上操作

代码如下:

#include <iostream>
#include <algorithm>
using namespace std;

bool FindTwo(int nAry[], int nMaxCount, int& n1, int& n2)
{
    for (int i = nMaxCount; i > 0; i--)
    {
        int nSumMax = nAry[i - 1];
        int nBegin = 0;
        int nEnd = nMaxCount - 1;
        while (nBegin != nEnd)
        {
            int nTemp = nAry[nBegin] + nAry[nEnd];
            if (nTemp == nSumMax)
            {
                n1 = nAry[nBegin];
                n2 = nAry[nEnd];
                return true;
            }
            else if (nTemp < nSumMax)
            {
                nBegin++;
            }
            else
            {
                nEnd--;
            }
        }
    }

    return false;
}

int main()
{
    const int MAX_COUNT = 10;
    int nAry[MAX_COUNT] = {8, 5, 7, 8, 8, 10, 7, 20, 11, 8}; // {5, 3, 4, 5, 3, 7, 8, 9, 6};
    sort(nAry, nAry + MAX_COUNT);

    int n1 = 0;
    int n2 = 0;
    if (FindTwo(nAry, MAX_COUNT, n1, n2))
    {
        cout << "sum: " << n1 + n2 << endl;
        cout << "factor: " << n1 << ends << n2 << endl;
    }
    else
    {
        cout << "not found" << endl;
    }
    return 0;
}

另外,如果将步骤二使用二分法查找,那会快许多,只需要把代码中

nBegin++ 改为 nBegin = nBegin + __max(1, (nEnd - nBegin) / 2);

nEnd-- 改为 nEnd = nEnd - __max(1, (nEnd - nBegin) / 2);

就可以了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值