167. 两数之和 II - 输入有序数组
167. 两数之和 II - 输入有序数组
一、题目描述
给定一个已按照 升序排列 的整数数组numbers ,请你从数组中找出两个数满足相加之和等于目标数target 。
函数应该以长度为 2 的整数数组的形式返回这两个数的下标值。numbers 的下标 从 1 开始计数 ,所以答案数组应当满足 1 <= answer[0] < answer[1] <= numbers.length 。
你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。
二、解题思路
因为是升序数组,并且找2个数的和等于某个值,所以可以从数组2头分别开始遍历,找到符合的值。
比如目标值是 t,此时选中左边 l,右边 r。
如果此时 l + r == t,直接满足条件;
如果 l + r < t,需要增大2数之和,那就取 l 的下一个数;
如果 l + r > t,需要减少2数之和,那就取 r 的前一个数。
为什么这种方式可以找到和为 t 的值呢?
首先,如果发现此时 l + r < t,那么就可以判定:
l 左边的值 ll 比 l 小,所以 ll + r < t,都不满足条件,排除.
其次,如果发现此时 l + r > t,那么就可以判定:
r 右边的值 rr 比 r 大,所以 l + rr > t,都不满足条件,排除。
通过不断排除这2种情况的值,就能逐步找到和为指定值的2个数值。
三、复杂度分析
- 时间
O(n)
- 空间
O(1)
四、参考代码
1 | /** |
167. 两数之和 II - 输入有序数组