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


    #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      //如果下面出现了和上面一样的数,稍加判断,就能找出这俩个数来了。

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

  • 相关阅读:
    Oracle 常用函数备查
    apt-get/dpkg常用指令备查
    vmware下虚拟机不能上网问题解决
    [转]JAVA并发编程学习笔记之Unsafe类
    solaris 下查看某程序所开端口
    java 守护线程
    Java实现非法访问异常
    Java使用ListIterator逆序ArrayList
    Java实现Map集合二级联动
    Java使用String类格式化当前日期
  • 原文地址:https://www.cnblogs.com/jiaoluo/p/3543268.html
Copyright © 2020-2023  润新知