微软面试100题之14题:输入一个已经按升序排序过的数组和一个数字, 在数组中查找两个数,使得它们的和正好是输入的那个数字。

来源:互联网 发布:刚哥哥淘宝店招制作 编辑:程序博客网 时间:2024/05/01 12:48
题目:输入一个已经按升序排序过的数组和一个数字,
在数组中查找两个数,使得它们的和正好是输入的那个数字。
要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字,输出任意一对即可。

例如输入数组1、2、4、7、11、15 和数字15。由于4+11=15,因此输出4 和11。

#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;}

下面给出一个比较简洁的代码:

#include<iostream>using namespace std; void FindNum(int* array,int length,int sum) { int *begin=&array [0]; int *end=&array[length-1]; while(begin<end) { if ((*begin+*end)>sum) { end--; }  else if((*begin+*end)<sum) { begin++; } else { cout<<*begin<<""<<*end<<endl; return; } } cout<<"cannot find"<<endl; }


0 1
原创粉丝点击