/*******************************************************************************************************************************************
3.找出兩個數組中滿足給定和的數對
問題描述:有兩個數組arr1和arr2,兩個數組均已經排好序,現在要找出這樣的x和y使得x+y=sum,其中sum已知,x是arr1中某個元素,y是arr2中的某個元素。
解決方案:既然數組arr1和arr2中的元素已經排好序了,那麼問題就簡單了不少。假設arr1[i] + arr2[j] > sum,若arr1下標不變,那麼要找到滿足條件的x和y,
只能取arr2中下標< j 的元素和arr1[i]相加,結果纔可能等於sum;假設arr1[i] + arr2[j] < sum,若arr2的下標不變,那麼要找到滿足條件的x和y,
只能取arr1中下標 > i 的元素和arr2[j]相加,結果纔可能等於sum。因此我們可以設置兩個指針 i 和 j ,分別指向arr1的開始位置和arr2結束位置,
這時 i 只能不斷變大,j 只能不斷變小,直到超過了數組的範圍。通過代碼更好理解,看代碼吧~~時間複雜度是O(n+m),n和m分別是arr1和arr2的大小。
************************************************************************************************************************************************/
bool getthesum(int arr1[], int arr2[], int length1, int length2, int sum)
{
bool find = false;
int i = 0;
int j = length2 - 1;
while( i < length1 && j >= 0)
{
if (arr1[i] + arr2[j] < sum)
{
i++;
}
else if(arr1[i] + arr2[j] > sum)
{
j--;
}
else if(arr1[i] + arr2[j] == sum)
{
find = true;
printf("arr1[%d]=%d and arr2[%d]=%d equals to %d\n", i, arr1[i], j, arr2[j], sum);
i++;
j--;
}
}
return find;
}
int _tmain(int argc, _TCHAR* argv[])
{
int arr1[7] = {1, 2, 3, 4, 5, 6, 7};
int arr2[7] = {3, 4, 5, 6, 7, 8, 9};
getthesum(arr1, arr2, 7, 7, 12);
getchar();
return 0;
}