首页
外语
计算机
考研
公务员
职业资格
财经
工程
司法
医学
专升本
自考
实用职业技能
登录
计算机
输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字,输出任意一对即可。 例如输入数组1、2、4、7、11、15和数字15。由于4+11=15,因此输出4
输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字,输出任意一对即可。 例如输入数组1、2、4、7、11、15和数字15。由于4+11=15,因此输出4
admin
2019-03-29
120
问题
输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字,输出任意一对即可。
例如输入数组1、2、4、7、11、15和数字15。由于4+11=15,因此输出4和11。
选项
答案
/////////////////////////////////////////////////////////////////////// // Find two numbers with a sum in a sorted array // Output: ture is found such two numbers, otherwise false /////////////////////////////////////////////////////////////////////// bool FindTwoNumbersWithSum ( int data[], // a sorted array unsigned int length, // the length of the sorted array int sum, // the sum int& num1, // the first number, output int& num2 // the second number, output ) { bool found = false; if(length < 1) return found; int ahead = length - 1; int behind = 0; while(ahead > behind) { long long curSum = data[ahead] + data[behind]; // if the sum of two numbers is equal to the input // we have found them if(curSum == sum) { num1 = data[behind]; num2 = data[ahead]; found = true; break; } // if the sum of two numbers is greater than the input // decrease the greater number else if(curSum > sum) ahead --; // if the sum of two numbers is less than the input // increase the less number else behind ++; } return found; }
解析
如果我们不考虑时间复杂度,最简单想法的莫过去先在数组中固定一个数字,再依次判断数组中剩下的n-1个数字与它的和是不是等于输入的数字。可惜这种思路需要的时间复杂度是O(n2)。
分析:如果我们不考虑时间复杂度,最简单想法的莫过去先在数组中固定一个数字,再依次判断数组中剩下的n-1个数字与它的和是不是等于输入的数字。可惜这种思路需要的时间复杂度是O(n2)。
我们假设现在随便在数组中找到两个数。如果它们的和等于输入的数字,那太好了,我们找到了要找的两个数字;如果小于输入的数字呢?我们希望两个数字的和再大一点。由于数组已经排好序了,我们是不是可以把较小的数字的往后面移动一个数字?因为排在后面的数字要大一些,那么两个数字的和也要大一些,就有可能等于输入的数字了;同样,当两个数字的和大于输入的数字的时候,我们把较大的数字往前移动,因为排在数组前面的数字要小一些,它们的和就有可能等于输入的数字了。
我们把前面的思路整理一下:最初我们找到数组的第一个数字和最后一个数字。当两个数字的和大于输入的数字时,把较大的数字往前移动;当两个数字的和小于数字时,把较小的数字往后移动;当相等时,打完收工。这样扫描的顺序是从数组的两端向数组的中间扫描。
问题是这样的思路是不是正确的呢?这需要严格的数学证明。感兴趣的读者可以自行证明一下。
转载请注明原文地址:https://kaotiyun.com/show/aRmZ777K
0
程序员面试
相关试题推荐
AWelcomeE-mail欢迎邮件Someinternationalstudentsarecomingtoyouruniversity.Writethemane-mailinthenameoftheStudent
输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)。例如输入的数组为1,-2,3,10,-4,7,2,-5,和最大的子数组为3,10,
大概描述一下ASP。NET页面的生命周期
ASP.NET能在那些系统中运行?
bob的电子邮件转发到wanglong@sina.com。
将上题的规则应用到已下载的邮件。
在控制面板中,将鼠标的"右手习惯"改为"左手习惯"。
计算机能直接识别和执行的语言是()A.机器语言B.高级语言C.数据库语言D.汇编程序
软盘写保护的作用是()。A.防止持签B.防止读盘C.防止显示D.防止写盘
下列有关break和continue语句的叙述中,正确的是________。
随机试题
舒张早期奔马律与生理性第三心音的区别不包括
既能祛风湿,又能退虚热的药物是
患者,男性,68岁,左股外侧疖肿2天,医嘱局部热敷。有关用氧注意事项错误的是()。
适用于融资租赁交易的融资物包括()。
背景资料: 建设单位就某工程项目与甲施工单位签订了施工总承包合同。经建设单位同意,甲施工单位选择了乙施工单位作为分包单位。在合同履行中,发生了如下事件: 事件一:在合同约定的工程开工日前,建设单位收到甲施工单位报送的“工程开工报审表”后即予处理。考虑到
【2014年山东省属.单选】教学是教儿童,不是单纯教教材,要展开真正的学习,儿童必须参与教学过程。有意义的学习只有在教材同学生自身的目的发生关系,由学生去认知时.才能产生。持这一主张的是()。
我国对个体农业实行社会主义改造所遵循的原则是()。
2015年年末,全国参加基本养老保险人数为85833万人,比上年年末增加1601万人。全年基本养老保险基金收入32195亿元,比上年增长16.6%。全年基本养老保险基金支出27929亿元,比上年增长19.7%。全国增加城镇职工基本养老保险人数为35361万
有以下程序(字母A的ASCII码值是65):#include<stdio.h>voidfun(char*s){while(*s){if(*s%2)printf("%c",*s);s++:}}main(){chara[]="BYTE
Thecommandersaidtohistroopsthatundernocircumstances______tostepacrosstheborder.
最新回复
(
0
)