题目: 输入一个已经按升序排序过的数组和一个数字, 在数组中查找两个数, 使得它们的和正好是输入的那个数字.
要求: 时间复杂度是O(n). 如果有多对数字的和等于输入的数字, 输出任意一对即可.
例如输入数组 1, 2, 4, 7, 11, 15和数字 15, 输出 4 和 11.
此题比较简单.
用i, j 分别表示数组的前后下标, 和小于sum, 则 i++; 和大于sum, 则 j--.
代码:
/*
* author: dengzhaoqun
*/
#include <stdio.h>
#include <stdlib.h>
int get_pair(int *array, int len, int sum);
int main()
{
int *array = NULL;
int len;
int sum;
int i;
printf("input array's len: ");
scanf("%d", &len);
array = (int *)malloc(len * sizeof(int));
for(i=0; i<len; i++)
{
printf("input array[%d]: ", i);
scanf("%d", &array[i]);
}
printf("input sum: ");
scanf("%d", &sum);
get_pair(array, len, sum);
return 0;
}
int get_pair(int *array, int len, int sum)
{
int i, j;
i = 0;
j = len -1;
while(i < j)
{
if((array[i] + array[j]) > sum)
{
j -- ;
}
else if((array[i] + array[j]) < sum)
{
i ++;
}
else if((array[i] + array[j]) == sum)
{
printf("yes.\n");
printf("%d + %d = %d\n", array[i], array[j], sum);
return 0;
}
}
printf("no.\n");
return(-1);
}