程序员面试题精选 100 题(10)-在排序数组中查找和为给定值的两个数字数组 -03-14 15:25:01 阅读 4663 评论 15 字号:大中小 订阅 题目:输入一种已经按升序排序过的数组和一种数字,在数组中查找两个数,使得它们的和恰好是输入的那个数字
规定时间复杂度是 O(n)
假如有多对数字的和等于输入的数字,输出任意一对即可
例如输入数组 1、2、4、7、11、15 和数字 15
由于 4+11=15,因此输出 4 和 11
分析:假如我们不考虑时间复杂度,最简单想法的莫过去先在数组中固定一种数字,再依次判断数组中剩余的 n-1 个数字与它的和是不是等于输入的数字
可惜这种思绪需要的时间复杂度是 O(n2)
我们假设目前随便在数组中找到两个数
假如它们的和等于输入的数字,那太好了,我们找到了要找的两个数字;假如不不小于输入的数字呢
我们但愿两个数字的和再大一点
由于数组已经排好序了,我们是不是可以把较小的数字的往背面移动一种数字
由于排在背面的数字要大某些,那么两个数字的和也要大某些,就有也许等于输入的数字了;同样,当两个数字的和不小于输入的数字的时候,我们把较大的数字往前移动,由于排在数组前面的数字要小某些,它们的和就有也许等于输入的数字了
我们把前面的思绪整理一下:最初我们找到数组的第一种数字和最终一种数字
当两个数字的和不小于输入的数字时,把较大的数字往前移动;当两个数字的和不不小于数字时,把较小的数字往后移动;当相等时,打完收工
这样扫描的次序是从数组的两端向数组的中间扫描
问题是这样的思绪是不是对的的呢
这需要严格的数学证明
感爱好的读者可以自行证明一下
参照代码:///////////////////////////////////////////////////////////////////////// Find two numbers wit