首页
外语
计算机
考研
公务员
职业资格
财经
工程
司法
医学
专升本
自考
实用职业技能
登录
计算机
输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。要求时间复杂度是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
73
问题
输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。要求时间复杂度是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
程序员面试
相关试题推荐
Thecommitteehasanticipatedtheproblemsthat______intheroadconstructionproject.
求1+2+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句(A?B:C)。
求1+2+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句(A?B:C)。
值类型和引用类型的区别?写出C#的样例代码。
设置邮件发送于30天之前那么隐藏邮件。
在控制面板中,将鼠标的"右手习惯"改为"左手习惯"。
关于计算机语言的描述,不正确的是()。A.机器语言的语句全部由0和1组成,指令代码短,执行速度快B.机器语言因为是面向机器的低级语言,所以执行速度慢C.汇编语言已将机器语言符号化,所以它与机器无关D.汇编语言比机器语言执行速度快
对计算机评价的主要性能指标有时钟频率、①、运算精度、内存容量等。对数据库管理系统评价的主要性能指标有②、数据库所允许的索引数量、最大并发事务处理能力等。②处应填入?
在数据库系统中,“事务”是访问数据库并可能更新各种数据项的一个程序执行单元。为了保证数据完整性,要求数据库系统维护事务的原子性、一致性、隔离性和持久性。针对事务的这4种特性,考虑以下的架构设计场景:假设在某一个时刻只有一个活动的事务,为了保证事务
在实际应用中,用户通常依靠评价程序来测试系统的性能。以下评价程序中,(16)的评测准确程度最低。事务处理性能委员会(TransactionProcessingPerformanceCouncil,TPC)是制定商务应用基准程序(Benchmark)标
随机试题
维生素D缺乏性佝偻病的一般治疗方法是
关于氟西汀性质的说法,正确的有()。
涉嫌抢劫罪的张某在审查起诉期间准备委托辩护人,下列人员中,谁可以接受委托作他的辩护人?(2004—卷二—91,任)
肖某由于工作地点变化,欲将其自住商品住房出售,委托甲房地产评估机构对该住房进行价值评估。估价师经现场查勘,发现室内使用大镜面作装饰,并大量运用花环、花束、弓箭、贝壳图案及纹样,属于洛可可装修风格。该商品房所在小区占地面积50000m2,其中有20幢3层联排
《危险化学品安全管理条例》规定,除运输工具加油站、加气站外,危险化学品的生产装置和储存数量构成重大危险源的储存设施,与()等场所、区域的距离必须符合国家标准或者国家有关规定。
公司一般不使用完全折旧但未报废的机械设备。()
下列小说或散文作品,依据所反映的社会生活内容和揭示的思想主旨,分类正确的一组是:①《孔乙己》②《荷塘月色》③《药》④《范进中举》⑤《阿Q正传》⑥《夜》
曲面3x2+y2一z2=27在点(3,1,1)处的切平面方程为_______.
Afewyearsback,manyhospitalsinAmericawereembarrassedbyrevelationsthatsomeoftheirneediestpatients,theuninsured,
打开考生文件夹下的演示文稿yswg.pptx,按照下列要求完成对此文稿的修饰并保存。在第一张幻灯片前插入一版式为“空白”的新幻灯片,插入5行2列的表格。表格样式为“中度样式4”。第一列的第1~5行依次录入“方针”“稳粮”“增收”“强基础”和“重民生”。
最新回复
(
0
)