0
点赞
收藏
分享

微信扫一扫

排序问题(O(n)复杂读)

小磊z 2022-04-06 阅读 64

【问题描述】

输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。要求时间复杂度是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;
}
举报

相关推荐

0 条评论