leetcode 167. Two Sum II - Input array is sorted(两数之和 II - 输入有序数组)--题解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_28635081/article/details/82819988

题目描述

给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。

函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2


说明

  1. 返回的下标值(index1和index2)不是从零开始的。
  2. 你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。

示例 

输入:numbers = [2, 7, 11, 15], target = 9

输出:[1, 2] 

解释:2 与 7 之和等于目标数9。因此 index1 = 1,index2 = 2。


 解题思路

本题同样可以使用两数之和I中的哈希表的方式,但是本题加上了输入有序这个条件,便可以采用另一种思路。

首先创建左右两个指针,分别指向数组的首尾元素,先对右指针进行处理,默认的条件是target = numbers[l] + numbers[r],所以numbers[r] = target - numbers[l],我们对不符合该条件(大于)的元素进行排除,处理之后的右指针指向的元素应该满足numbers[r] <= target - numbers[l],然后对左右指针之间的元素进行筛选(包括左右指针的元素),当二者之和小于target时,左指针自增1,大于target时,右指针自减1,等于时跳出循环,最后按顺序返回两个指针+1。


代码 

public int[] twoSum(int[] numbers, int target) {
    int[] result = new int[2];
    int l = 0, r = numbers.length - 1;
    while (r > 0 && numbers[r] > target - numbers[l]) {
        r--;
    }
    while (l < r) {
        if (target == numbers[l] + numbers[r]) break;
        if (target > numbers[l] + numbers[r]) l++;
        else r--;
    }
    result[0] = l + 1;
    result[1] = r + 1;
    return result;
}

执行结果

 


欢迎各位大神指点 

猜你喜欢

转载自blog.csdn.net/qq_28635081/article/details/82819988