【双指针】LeetCode 167. 两数之和 II - 输入有序数组

题目链接

167. 两数之和 II - 输入有序数组

思路

本思路来自 一张图告诉你 O(n) 的双指针解法的本质原理(C++/Java)

下图是白色部分初始的搜索空间,即 A[0] + A[7]

image

假如 target > A[0] + A[7],此时 A[7]已经是搜索空间中最大的数了,所以应该让 A[0] 变为 A[1],搜索空间也变为下图所示。

image

通过上图可以看到,我们可以排除所有 A[0] + A[j] 的情况。

假如此时 target < A[1] + A[7],因为 A[1] 已经是搜索空间中的最小数了,所以应该让 A[7] 变为 A[6]。搜索空间变为下图所示。

image

这样一步步缩减搜索空间,便能得到最终答案。

image

代码

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

posted @ 2023-01-28 10:06  Frodo1124  阅读(28)  评论(0编辑  收藏  举报