【问题描述】
输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字,输出任意一对即可。
【输入形式】
一个升序排序的数组以空格隔开,以及一个目标数字,换行输入
【输出形式】
如果存在数组中两个数字和为目标数字,则输出数字对;
如果存在多个满足条件的数字对,输入一对即可;
不存在则不输出;
【样例输入】
1 2 4 7 11 15 15
【样例输出】
4 11
【样例说明】
4+11=15
【评分标准】
时间复杂度必须为 O(n),否则酌情给分。
思路:第一个数与最后一个数相加如果大于,就第一个数与倒数第二个数相加,小于就第二个与倒数第二个相加,依此类推找到相等的,记录下标即可
题解:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
int temp;
int a[10000];
int n = 0;
while (1)
{
if (scanf("%d", &a[n]) == EOF)//由于不知道有多少个输入数据。所以用该条件跳出接受数据的循环(含义自己百度查)
{
break;
}
if (a[n] == 10086) { break; }//测试时用于跳出循环
++n;
}
temp = a[n - 1];
int n1=0, n2=n-2,flag=0;
while (1)
{ if(a[n1]+a[n2]==temp)
{
break;
}
if (a[n1] + a[n2] > temp)
{
n2 = n2 - 1;
}
if (a[n1] + a[n2]<temp)
{
n1= n1+1;
}
}
printf("%d %d", a[n1], a[n2]);
return 0;
}