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

来源:互联网 发布:显卡优化怎么设置 编辑:程序博客网 时间:2024/06/02 02:38

题目来源: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);

就可以了。

0 0
原创粉丝点击