Leetcode167 - 两数之和Ⅱ

例题:

Leetcode167 - 两数之和Ⅱ_第1张图片

分析:

因为数组已按非递减顺序排列,我们可以用双指针的思想,定义两个指针i,j,i指向数组中的第一个元素,j指向数组中的最后一个元素。把指针i,j所指向的两个元素相加和target比较。如下图:

蓝色的线代表target,黑色的线分别表示数组中已排好序的元素。线越长代表数越大,越短代表数越小。

Leetcode167 - 两数之和Ⅱ_第2张图片

先把i处和j处的元素相加

Leetcode167 - 两数之和Ⅱ_第3张图片

i + j 和 j + i 的结果图中都画出来了(看哪根线都一样)

不难发现,i + j 的结果大于 target,因此应该把 j 指针向左移,让i + j的和变小一点。

Leetcode167 - 两数之和Ⅱ_第4张图片

现在又比target小了,把 i 指针向右移.....   重复上述过程,直到找到和为target的两个元素。

Leetcode167 - 两数之和Ⅱ_第5张图片

思路:

①:两个指针 i 和 j 分别指向最左侧和最右侧的数字

②:他俩指向的数字和与target相比

        - 小于target   i++ 向右找

        - 大于target   j --  向左找

        - 等于target  找到了

代码实现:
import java.util.Arrays;

public class SumLeetcode167 {

    public static void main(String[] args) {
        System.out.println(Arrays.toString(twoSum(new int[]{2, 7, 11, 15}, 9)));
    }

    public static int[] twoSum(int[] numbers, int target) {
        int i = 0;
        int j = numbers.length - 1;
        while (i < j) {
            int sum = numbers[i] + numbers[j];
            if (sum < target) {
                i++;
            } else if (target < sum) {
                j--;
            } else {
                break;
            }
        }
        return new int[]{i + 1, j + 1};
    }
}

你可能感兴趣的:(数据结构)