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

【问题描述】

输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。要求时间复杂度是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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值