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

目录

1、Question

2、Analysis

3、Code

4、Result


1、Question

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

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

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

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

        示例

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

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

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

        提示

2  <= numbers.length <= 3 * 10^4
-1000  <=  numbers[i]  <=  1000
numbers 按 非递减顺序 排列
-1000 <= target <= 1000
仅存在一个有效答案

2、Analysis

        这题很简单,通过给出的提示,明确数组中数组的取值范围为 [-1000, 1000],是有限的,而且在数组的长度限制范围内,所以我们完全可以生命一个hash数组,将numbers[i]作为数组索引,i + 1作为数组的赋值,实现快速查找。具体如下代码所示,需要注意如何实现负数的快速索引。

        另一种巧妙的解法,可以利用numbers数组递增的特点,使用双指针首尾相向遍历numbers数组。

3、Code

class Solution {
public:
    vector twoSum(vector& numbers, int target)
    {
        int size = numbers.size();
        int records[2001] = {0}, flat = 1000;
        vector result;
        for (int i = 0; i < size; i++)
        {
            records[numbers[i] + 1000] = i + 1;
        }
        for (int i = 0; i < size; i++)
        {
            int tmp = target - numbers[i] + flat;
            if (tmp <= 2000 && tmp >= 0 && records[tmp] != 0)
            {
                result.push_back(i + 1);
                result.push_back(records[tmp]);
                break;
            }
        }
        return result;
    }

};
vector twoSum(vector& numbers, int target) {
    int l = 0, r = numbers.size() - 1, sum;
    while (l < r) 
    {
        sum = numbers[l] + numbers[r];
        if (sum == target) break;
        if (sum < target) ++l;
        else --r;
    }
    return vector{l + 1, r + 1};
}

4、Result

167. 两数之和 II - 输入有序数组_第1张图片

你可能感兴趣的:(力扣刷题,C++,LeetCode,算法,Hash)