【双指针】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

浙公网安备 33010602011771号