分析:
有序的数组(假设非降序),采取双向遍历,一个从前往后,一个从后往前,当前数字相加如果相等则返回,如果小于k则前面的继续往后,如果大于k则后面的继续往前
typedef struct Pairs
{
int x;//第一个数的下标
int y;//第二个数的下标
}Pairs;
Pairs SumToK(int *arr,int len,int k)//时间复杂度O(n),空间复制度O(1)
{
Pairs pa = {-1,-1};
int low = 0; //从前往后遍历
int high = len-1;//从后往前遍历
int sum;
while(low <= high)
{
sum = arr[low] + arr[high];
if(sum < k)
{
low++;
}
else if(sum > k)
{
high--;
}
else
{
pa.x = low;
pa.y = high;
break;
}
}
return pa;
}
int main()
{
int arr[] = {1,3,5,6,17,18,29,33,44,55,89};
int k = 9;
Pairs pa = SumToK(arr,sizeof(arr)/sizeof(arr[0]),k);
if(pa.x == -1)
printf("没有两数相加等于%d\n",k);
else
printf("相加等于%d的为%d,%d下标的值\n",k,pa.x,pa.y);
k = 50;
pa = SumToK(arr,sizeof(arr)/sizeof(arr[0]),k);
if(pa.x == -1)
printf("没有两数相加等于%d\n",k);
else
printf("相加等于%d的为%d,%d下标的值\n",k,pa.x,pa.y);
k = 4;
pa = SumToK(arr,sizeof(arr)/sizeof(arr[0]),k);
if(pa.x == -1)
printf("没有两数相加等于%d\n",k);
else
printf("相加等于%d的为%d,%d下标的值\n",k,pa.x,pa.y);
k = 1;
pa = SumToK(arr,sizeof(arr)/sizeof(arr[0]),k);
if(pa.x == -1)
printf("没有两数相加等于%d\n",k);
else
printf("相加等于%d的为%d,%d下标的值\n",k,pa.x,pa.y);
}