第14 题:题目:输入一个已经按升序排序过的数组和一个数字

在已排序的数组中,通过O(n)时间复杂度找到两数之和等于给定目标值的数字对。采用双指针法,从数组两端开始比较,根据和与目标值的关系调整指针位置,直至找到符合条件的数字对。
摘要由CSDN通过智能技术生成

 第14 题:
题目:输入一个已经按升序排序过的数组和一个数字,
在数组中查找两个数,使得它们的和正好是输入的那个数字。
要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字,输出任意一对即可。
例如输入数组1、2、4、7、11、15 和数字15。由于4+11=15,因此输出4 和11。

 

思路:

1、检测任意一个元素与其他n-1个元素之和,时间复杂度为O(n^2);

2、选择第一个元素a1与最后一个元素an, 假设输入的和为sum

如果a1 + an大于sum,说明我们需要将其中一个加数变小,a1无法再变小了,所以an->an-1

如果a1 + an小于sum,说明需要将加数变大,a1->a2

 

伪代码:

输入为 array[1...n], sum

head = 1;

tail = n;

while head <tail

    do if  array[head] + array[tail] > sum

                tail <- tail - 1;

         else if array[head]  + array[tail] < sum

               head<- head + 1;

         else

               // the numbers in index head , tail is what we want

 

代码:

#includ
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值