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

Posted 我要出家当道士

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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<int> twoSum(vector<int>& numbers, int target)
    
        int size = numbers.size();
        int records[2001] = 0, flat = 1000;
        vector<int> 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<int> twoSum(vector<int>& 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<int>l + 1, r + 1;

4、Result

以上是关于167. 两数之和 II - 输入有序数组的主要内容,如果未能解决你的问题,请参考以下文章

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

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

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

LeetCode167. 两数之和 II - 输入有序数组(C++)

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

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