数据结构与算法面试题80道(14)

14:

题目:输入一个已经按升序排序过的数组和一个数字,

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

要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字,输出任意一对即可。

例如输入数组12471115和数字15。由于4+11=15,因此输出411

 

思路:从前后同时往中间扫,如果当前两个数的和大于sum,后面的数往前移,如果和小于sum,前面的数往后移。

 

 

#include<cstdio>
#include<iostream>
using namespace std;
void findNum(int arr[],int length,int sum){
    int left=0,right=length;
    while(left<right){
        if(arr[left]+arr[right]==sum) {
            cout<<arr[left]<<" "<<arr[right]<<endl;
            return;
        }
        else if(arr[left]+arr[right]>sum) right--;
        else left++;
    }
    cout<<"cannot find"<<endl;
}

int main(){
    int arr[]={1,2,4,7,11,15};
    int length=sizeof(arr)/sizeof(arr[0])-1;
    findNum(arr,length,15);
    return 0;
}

 

posted @ 2016-03-11 12:59  dreamOwn  阅读(354)  评论(0编辑  收藏  举报