1. 程式人生 > >輸入一個已經按升序排序過的陣列和一個數字, 在陣列中查詢兩個數,使得它們的和正好是輸入的那個數字。

輸入一個已經按升序排序過的陣列和一個數字, 在陣列中查詢兩個數,使得它們的和正好是輸入的那個數字。

題目:輸入一個已經按升序排序過的陣列和一個數字,在陣列中查詢兩個數,使得它們的和正好是輸入的那個數字。

要求時間複雜度是 O(n)。如果有多對數字的和等於輸入的數字,輸出任意一對即可。例如輸入陣列 1、2、4、7、11、15 和數字 15。由於 4+11=15,因此輸出 4 和 11。

由於是有序的,可以用雙指標來做。第一個指標i指向a[0],第二個j指向a[n-1],

若a[i]+a[j]>v,j--;

若a[i]+a[j]<v,i++;

若a[i]+a[j]=v,結束。

#include <iostream>
using namespace std;
void find(int a[],int n,int v)
{
	int i=0;
	int j=n-1;
	while(i<j )
	{
		if(a[i]+a[j]<v)
		{
			i++;
		}
		else if(a[i]+a[j]>v)
		{
			j--;
		}
		else
		{
			cout<<a[i]<<" + "<<a[j]<<" = "<<v<<endl;
			return;
		}
	}
}
void main()
{
	int a[10]={1,3,6,8,11,13,15,17,20,22};
	find(a,10,4);
	system("pause");
}