【LeetCode】167. Two Sum II - Input array is sorted 解题记录
问题描述
Given an array of integers numbers that is already sorted in ascending order, find two numbers such that they add up to a specific target number.
Return the indices of the two numbers (1-indexed) as an integer array answer of size 2, where 1 <= answer[0] < answer[1] <= numbers.length.
You may assume that each input would have exactly one solution and you may not use the same element twice.
测试样例
1 | Input: numbers = [2,7,11,15], target = 9 |
1 | Input: numbers = [2,3,4], target = 6 |
1 | Input: numbers = [-1,0], target = -1 |
说明
1 | 2 <= numbers.length <= 3 * 10^4 |
解题
思路
数组已经排好序,可以采用双指针来求解。两个指针分别指向首、尾元素,并沿反方向遍历,可能出现三种情况:
- 两个指针指向元素的和等于给定值,那么它们就是我们要的结果。
- 两个指针指向元素的和小于给定值,把左边的指针右移一位,使得当前的和增加一点。
- 两个指针指向元素的和大于给定值,把右边的指针左移一位,使得当前的和减少一点。
补充:
-
双指针
-
时间复杂度
O(n)
-
对于排好序且有解的数组,双指针一定能遍历到最优解
假设最优解的两个数的位置分别是
l
和r
。- 假设在左指针在
l
左边的时候,右指针已经移动到了r
;此时两个指针指向值的和小于给定值,因此左指针会一直右移直到到达l
。 - 假设在右指针在
r
右边的时候,左指针已经移动到了l
;此时两个指针指向值的和大于给定值,因此右指针会一直左移直到到达r
。
所以双指针在任何时候都不可能处于
(l,r)
之间,又因为不满足条件时指针必须移动一个,所以最终一定会收敛在l
和r
。 - 假设在左指针在
代码
1 | class Solution { |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 哆啦 C 梦!
评论