题目:输入一个已经按升序排序过的数组和一个数字,
在数组中查找两个数,使得它们的和正好是输入的那个数字。
要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字,输出任意一对即可。
在数组中查找两个数,使得它们的和正好是输入的那个数字。
要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字,输出任意一对即可。
例如输入数组1、2、4、7、11、15和数字15。由于4+11=15,因此输出4和11。
#include "stdio.h"
#include "stdlib.h"
//Refer to the online answer
void FindTwoNumbers(int R[], int sum, int n){
int b[100] = {0};
for(int i=0; i<n; ++i){
b[R[i]]++;
}
int rest = 0;
for(int j=0; j<n; ++j){
rest = sum - R[j];
if(b[rest] == 1){
printf("%d + %d = %d\n", R[j], rest, sum);
return;
}
}
}
//Refer to the online answer and add to some ideas of mine.
void FindTwoNumbers_2(int R[], int sum, int n){
int start = 0;
int end = n-1;
while(R[start] + R[end] > sum && start < end)
--end;
while(R[start] + R[end] < sum && start < end)
++start;
if(R[start] + R[end] == sum && start < end)
printf("%d + %d = %d\n", R[start], R[end], sum);
else
printf("The result not found!...");
}
void main()
{
int R[]={1,2,4,5,6,8,10,15,16};
int n = sizeof(R)/sizeof(int);
int k=12;
FindTwoNumbers_2(R,11, n);
}