在数组中查找两个数,使得它们的和正好是输入的那个数字

#include <iostream>
#include <vector>
using namespace std;
void FindTwoNumberWithSum(int data[],unsigned int length,
                          int sum,int &num1,int &num2)
{
    if(length<=1)
        return;
    int begin=0;
    int end=length-1;
    int cur=0;
    while(begin<end)
    {
        cur=data[begin]+data[end];
        if(cur==sum)
        {
            num1=data[begin];
            num2=data[end];

            return;
        }
        if(cur<sum)
        {
            begin++;
        }
        if(cur>sum)
            end--;
    }
}

void FindAnser(int data[],int cur,int sum,int idx,std::vector<int> col,int len)
{
    if(sum<=cur)
    {
        if(sum==cur)
        {
            std::vector<int>::iterator iter=col.begin();
            for(;iter!=col.end();iter++)
                cout<<*iter<<" ";
            cout<<endl;
        }
        return;
    }
    for(int i=idx;i<len;i++)
    {
        col.push_back(data[i]);
        FindAnser(data,cur+data[i],sum,i+1,col,len);//看懂这两个地方
        col.pop_back();                             //看懂这两个地方
    }
}

int main()
{
    int data[]={4,5,7,10,12};
    //int num1,num2;
    //FindTwoNumberWithSum(data,sizeof(data)/sizeof(int),12,num1,num2);
    //cout<<num1<<" "<<num2<<endl;
    std::vector<int> col;
    FindAnser(data,0,22,0,col,sizeof(data)/sizeof(int));
    return 0;
}

题目:输入一个已经按升序排序过的数组和一个数字, 在数组中查找两个数,使得它们的和正好是输入的那个数字。 要求时间复杂度是O(n)。 如果有多对数字的和等于输入的数字,输出任意一对即可。   例如输入数组1、2、4、7、11、15和数字15。由于4+11=15,因此输出4和11。 //由于数组已经过升序排列,所以,难度下降了不少。 //July、2010/10/19

#include <iostream.h>

bool FindTwoNumbersWithSum ( int data[],           // 已经排序的 数组 unsigned int length,  // 数组长度     int sum,              //用户输入的 sum  int& num1,            // 输出符合和等于sum的第一个数 int& num2             // 第二个数 ) {        bool found = false;     if(length < 1)         return found;         int begin = 0;     int end = length - 1;         while(end > begin)     {         long curSum = data[begin] + data[end];                 if(curSum == sum)         {             num1 = data[begin];             num2 = data[end];             found = true;             break;         }         else if(curSum > sum)             end--;         else             begin++;     }     return found; }

int main() {     int x,y;     int a[6]={1,2,4,7,11,15};     if(FindTwoNumbersWithSum(a,6,15,x,y) )     {         cout<<x<<endl<<y<<endl;     }     return 0; } 4 11 Press any key to continue

扩展:如果输入的数组是没有排序的,但知道里面数字的范围,其他条件不变, 如何在O(n)时间里找到这两个数字?

 

关于第14题, 1.题目假定是,只要找出俩个数,的和等于给定的数, 其实是,当给定一排数, 4,5,7,10,12 然后给定一个数,22。 就有俩种可能了。因为22=10+12=10+5+7。 而恰恰与第4题,有关联了。望大家继续思考下。:)。

2.第14题,还有一种思路,如下俩个数组: 1、 2、  4、7、11、15     //用15减一下为  14、13、11、8、4、 0      //如果下面出现了和上面一样的数,稍加判断,就能找出这俩个数来了。

第一个数组向右扫描,第二个数组向左扫描。

原文地址:https://www.cnblogs.com/jiaoluo/p/3543268.html