列表

详情


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

给你一个下标从 1 开始的整数数组 numbers ,该数组已按 非递减顺序排列  ,请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是 numbers[index1]numbers[index2] ,则 1 <= index1 < index2 <= numbers.length

以长度为 2 的整数数组 [index1, index2] 的形式返回这两个整数的下标 index1 index2

你可以假设每个输入 只对应唯一的答案 ,而且你 不可以 重复使用相同的元素。

你所设计的解决方案必须只使用常量级的额外空间。

 

示例 1:

输入:numbers = [2,7,11,15], target = 9
输出:[1,2]
解释:2 与 7 之和等于目标数 9 。因此 index1 = 1, index2 = 2 。返回 [1, 2] 。

示例 2:

输入:numbers = [2,3,4], target = 6
输出:[1,3]
解释:2 与 4 之和等于目标数 6 。因此 index1 = 1, index2 = 3 。返回 [1, 3] 。

示例 3:

输入:numbers = [-1,0], target = -1
输出:[1,2]
解释:-1 与 0 之和等于目标数 -1 。因此 index1 = 1, index2 = 2 。返回 [1, 2] 。

 

提示:

相似题目

两数之和

两数之和 IV - 输入 BST

小于 K 的两数之和

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
class Solution { public: vector<int> twoSum(vector<int>& numbers, int target) { } };

golang 解法, 执行用时: 4 ms, 内存消耗: 3 MB, 提交时间: 2021-07-14 00:56:46

func twoSum(numbers []int, target int) []int {
    l, r := 0, len(numbers) - 1
    res := []int{0, 0}
    for l < r {
        if numbers[l] + numbers[r] == target {
            res[0] = l+1
            res[1] = r+1
            break
        } else if numbers[l] + numbers[r] < target {
            l++
        } else {
            r--  
        }
    }
    return res
}

golang 解法, 执行用时: 8 ms, 内存消耗: 3.1 MB, 提交时间: 2019-04-07 13:37:41

func twoSum(numbers []int, target int) []int {
    l := 0
    r := len(numbers) - 1
    res := []int{0, 0}
    for {
        if numbers[l] + numbers[r] == target {
            res[0] = l+1
            res[1] = r+1
            break
        } else if numbers[l] + numbers[r] < target {
            l++
        } else {
            r--  
        }
    }
    return res
}

php 解法, 执行用时: 64 ms, 内存消耗: 17.8 MB, 提交时间: 2019-04-07 13:29:38

class Solution {

    /**
     * @param Integer[] $numbers
     * @param Integer $target
     * @return Integer[]
     */
    function twoSum($numbers, $target) {
        $l = 0;
        $r = count($numbers) - 1;
        while ( $l < $r ) {
            if ( $numbers[$l] + $numbers[$r] == $target )
                return [$l+1, $r+1];
            elseif ( $numbers[$l] + $numbers[$r] < $target )
                $l++;
            else
                $r--;
        }
    }
}

java 解法, 执行用时: 1 ms, 内存消耗: 37.4 MB, 提交时间: 2019-04-07 13:26:45

class Solution {
    public int[] twoSum(int[] numbers, int target) {
        int l = 0, r = numbers.length - 1;
        int[] res = {0, 0};
        while ( l < r ) {
            if ( numbers[l] + numbers[r] == target ) {
                res[0] = l+1;
                res[1] = r+1;
                break;
            } else if ( numbers[l] + numbers[r] < target ) {
                l++;
            } else {
                r--;
            }
        }
        return res;
    }
}

python3 解法, 执行用时: 60 ms, 内存消耗: 13.1 MB, 提交时间: 2019-04-07 13:18:46

class Solution:
    def twoSum(self, numbers, target):
        """
        :type numbers: List[int]
        :type target: int
        :rtype: List[int]
        """
        l = 0
        r = len(numbers) - 1
        while l < r:
            if numbers[l] + numbers[r] == target:
                return [l+1, r+1]
            elif numbers[l] + numbers[r] < target:
                l += 1
            else:
                r -= 1
        

javascript 解法, 执行用时: 92 ms, 内存消耗: 34.2 MB, 提交时间: 2019-04-07 13:15:18

/**
 * @param {number[]} numbers
 * @param {number} target
 * @return {number[]}
 */
var twoSum = function(numbers, target) {
    let l = 0; r = numbers.length - 1;
    while(l < r) {
        if (numbers[l] + numbers[r] === target) {
            let res = [l+1, r+1];
            return res;
        } else if (numbers[l] + numbers[r] < target) {
            l++;
        } else {
            r--;
        }
    }  
};

上一题