167. 两数之和 II - 输入有序数组
Posted 我要出家当道士
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了167. 两数之和 II - 输入有序数组相关的知识,希望对你有一定的参考价值。
目录
1、Question
给你一个下标从 1 开始的整数数组 numbers ,该数组已按 非递减顺序排列 ,请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是 numbers[index1] 和 numbers[index2] ,则 1 <= index1 < index2 <= numbers.length。
以长度为 2 的整数数组 [index1, index2] 的形式返回这两个整数的下标 index1 和 index2。
你可以假设每个输入 只对应唯一的答案 ,而且你 不可以 重复使用相同的元素。
你所设计的解决方案必须只使用常量级的额外空间。
示例
输入: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
LeetCode 167. 两数之和 II - 输入有序数组