天天看點

兩數之和2 - 輸入有序數組

給定一個已按照升序排列 的有序數組,找到兩個數使得它們相加之和等于目标數。

函數應該傳回這兩個下标值 index1 和 index2,其中 index1 必須小于 index2。

說明:

傳回的下标值(index1 和 index2)不是從零開始的。

你可以假設每個輸入隻對應唯一的答案,而且你不可以重複使用相同的元素。

示例:

輸入:

numbers = [2, 7, 11, 15], target = 9

輸出: 

[1,2]      
class Solution {
    public int[] twoSum(int[] numbers, int target) {
        int length = numbers.length;
        // 0<index1<index2<length
        int index1 = 0;
        int index2 = length - 1;
        int[] result = new int[2];
        while(index1<index2){
            //相加小于目标值,index1右移,對應數值增大
            if(numbers[index1]+numbers[index2] < target){
                index1++;
            }else if(numbers[index1]+numbers[index2] > target){
                //相加大于目标值,index2左移,對應數值減小
                index2--;
            }else{
                //根據題目要求
                result[0] = index1+1;
                result[1] = index2+1;
                break;
            }
        }
        return result;
    }
}      
  • 雙指針

    初始化兩個指針,index1指向最小元素(該數組是有序數組),即index1指向數組第一個元素,index2指向最大元素(數組最後一個元素)

    比較思路:

  1. 當兩指針對應的值相加小于目标值,則移動index1指針,增大數值
  2. 當兩指針對應的值相加大于目标值,則移動index2指針,減小數值
  3. 當兩指針對應的數值相加等于目标值,則是最後結果