【剑指Offer】面试题57-1:和为s的两个数字

题目:输入一个递增排序的数组和一个数字 s,在数组中查找两个数,使得它们的和正好是 s。如果有多对数字的和等于 s,则输出任意一对即可。

思路 1:穷举

最直观的思路是:穷举数组的数对,验证和是否等于 s。这样的做法的时间复杂度是 $O(n^2)$。我们需要思考更快的算法。

思路 2:左右逢源

这个思路是:定义两个确定方向的指针,左指针首先指向最小数字只能往右走,右指针首先指向最大数字只能往左走;验证两个指针指向的数字的和是否等于 s,如果等于则输出这两个数字;如果小于 s 则左指针右移一位;如果大于 s 则右指针左移一位;重复上述操作,知道找到和等于 s 的两个数字。这个算法只用遍历数组一遍,时间复杂度是 O(n)。