【双指针】LeetCode 167. 两数之和 II - 输入有序数组
题目链接
思路
本思路来自 一张图告诉你 O(n) 的双指针解法的本质原理(C++/Java)
下图是白色部分初始的搜索空间,即 A[0] + A[7]
假如 target > A[0] + A[7]
,此时 A[7]
已经是搜索空间中最大的数了,所以应该让 A[0]
变为 A[1]
,搜索空间也变为下图所示。
通过上图可以看到,我们可以排除所有 A[0] + A[j]
的情况。
假如此时 target < A[1] + A[7]
,因为 A[1]
已经是搜索空间中的最小数了,所以应该让 A[7]
变为 A[6]
。搜索空间变为下图所示。
这样一步步缩减搜索空间,便能得到最终答案。
代码
class Solution {
public int[] twoSum(int[] numbers, int target) {
int index1 = 0;
int index2 = numbers.length - 1;
while(index1 < index2){
if(numbers[index1] + numbers[index2] == target){
break;
}
if(numbers[index1] + numbers[index2] < target){
index1++;
}else{
index2--;
}
}
return new int[]{index1 + 1, index2 + 1};
}
}
拓展
11.盛最多水的容器
240.搜索二维矩阵 II