《劍指offer》:[41]陣列中和為S的兩個數

塵虛緣_KY發表於2016-06-19
題目:輸入一個遞增排序的陣列和一個數字S,在陣列中查詢兩個數,是的它們的和正好是S。如果有多對數字的和等於S,輸出其中的一對即可。
例如輸入陣列{1,2,4,7,11,15}和數字15.由於4+11=15,因此輸出4和11。
方案一:時間複雜度為O(N*N)。順序查詢法,固定一個數,然後和剩餘的N-1個數做和,看和是否為S;如沒有,將固定的數下移一個,再與N-2個數字做和,看是否相等。很明顯,其時間複雜度為:O(N*N) 。

方案二:時間複雜度為O(N)的查詢方法。因為陣列是有序的遞增的序列,我們可以定義兩個指標,第一個指標指向第一個,第二個指標指向第二個。如果這兩個數字的和小於S,則將第一個指標向後移,這樣得到的和就會變大;否則將第二個指標向前移動,這樣得到的和就會小於S。具體分析過程如下:

具體實現程式碼如下:

#include<iostream>
using namespace std;
int arr[6]={1,2,4,7,11,15};
bool FindNumberWithSum(int *array,int length,int sum,int *num1,int *num2)
{
	bool found=false;
	if(NULL==array ||length<=0)
		return found ;
	int ahead=length-1;
	int behind=0;
	while(behind<ahead)
	{
		int CurSum=array[behind]+array[ahead];
		if(CurSum==sum)
		{
			*num1=array[behind];
			*num2=array[ahead];
			found=true;
			break;
		}
		else if(CurSum > sum)
			ahead--;
		else
			behind++;
	}
	return found;
}
int main()
{
	int num1,num2;
	bool result=FindNumberWithSum(arr,6,15,&num1,&num2);
	if(result)
		cout<<"陣列中和為15的兩個數為:"<<num1<<" "<<num2	<<endl;
	else
		cout<<"不存在兩個數的和S"<<endl;
	system("pause");
	return 0;
}
執行結果:





相關文章