1.問題描述:
輸入一個已經按升序排序過的數組和一個數字,在數組中尋找兩個數,使得它們的和正好是輸入的那個數字。要求時間複雜度是O(n)。如果有多對數位和等於輸入的數字,輸出任意一對即可。
2.解題思路:
從向量的兩端開始移動,如果兩端之和等於輸入的整數,則找到解,如果兩端之和小於輸入的整數,移動低端指標,否則移動高端指標
例如 2 3 6 8 9 10 11 22 ,輸入整數17,則輸出 8 9
3.代碼
/*This is a free Program, You can modify or redistribute it under the terms of GNU*Description:輸入一個已經按升序排序過的數組和一個數字,在數組中尋找兩個數,使得它們的和*正好是輸入的那個數字。要求時間複雜度是O(n)。如果有多對數位和等於輸入的數字,*輸出任意一對即可。*Language: C++*Development Environment: VC6.0*Author: Wangzhicheng*E-mail: 2363702560@qq.com*Date: 2012/11/29*/#include <iostream>#include <vector>using namespace std;/**從向量的兩端開始移動,如果兩端之和等於輸入的整數,則找到解*如果兩端之和小於輸入的整數,移動低端指標,否則移動高端指標*/void Solution(vector<int>&v,int &num) {vector<int>::iterator start=v.begin();vector<int>::iterator finish=v.end()-1;while(start!=finish) {if(*start+*finish==num) {cout<<*start<<"+"<<*finish<<"="<<num<<endl;return;}else if(*start+*finish<num) start++;else finish--;}}void main() {const int n=10;int i;int e;vector<int>v;for(i=0;i<n;i++) {cout<<"請輸入第"<<i<<"個數:";cin>>e;v.push_back(e);}int num;cout<<"請輸入一個整數:";cin>>num;Solution(v,num);}