微软100道算法题-----输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。要求:时间复杂度是O(n)。如果有多对数字的和等于输入的数字,输出任意一对。
思路:设置两个指针,一个指向开头,一个指向结尾,两数相加,如果和大了,则右边的指针往左移,如果和小了,则左边的指针往右移。
int main(void)
{
int arry[] = {1, 3, 4, 6, 7, 8, 9};
int key = 11;
int len = sizeof(arry)/sizeof(arry[0]);
int i, sum;
int *head = &arry[0];
int *tail = &arry[len-1];
for(i=0; i<len/2; i++)
{
sum = *(head) + *(tail);
if(sum > key)
{
tail--;
}
else if(sum < key)
{
head++;
}
else if(key == sum)
{
printf("%d + %d\n", *(head), *(tail));
}
else
printf("该数组中没有两数之和满足条件\n");
}
return 0;
}