Leetcode167:两数之和 II - 输入有序数组
题目描述
给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。
函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。
说明:
返回的下标值(index1 和 index2)不是从零开始的。
你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。
示例:
输入: numbers = [2, 7, 11, 15], target = 9
输出: [1,2]
解释: 2 与 7 之和等于目标数 9 。因此 index1 = 1, index2 = 2 。
解法一:基于双指针的方法
class Solution {
public:
vector<int> twoSum(vector<int>& numbers, int target) {
int low = 0, high = numbers.size() - 1;
while (low<high)
{
int sum = numbers[low] + numbers[high];
if (sum == target)
return { low + 1,high + 1 };
else if (sum<target)
low++;
else
high--;
}
return { -1,-1 };
}
};
解法二:基于unordered_map的方法
class Solution2 {
public:
vector<int> twoSum(vector<int>& numbers, int target) {
unordered_map<int, int> m;
vector<int> b(2, 0);
for (int i = 0; i<numbers.size(); i++)
m[numbers[i]] = i;
for (int i = 0; i<numbers.size(); i++)
{
if (m.count(target - numbers[i]) && (m[target - numbers[i]] != i))
{
b[0] = i + 1;
b[1] = m[target - numbers[i]] + 1;
break;
}
}
return b;
}
};
main()函数
#include "stdafx.h"
#include <iostream>
#include <vector>
#include <unordered_map>
using namespace std;
int main()
{
vector<int> nums;
cout << "请输入有序数组的大小: " << endl;
int Size;
cin >> Size;
cout << "请输入有序数组的元素: " << endl;
int Currval;
for (int i = 0; i < Size; i++)
{
cin >> Currval;
nums.push_back(Currval);
}
cout << "请输入目标元素: " << endl;
int target;
cin >> target;
Solution answer;
vector<int> b(2, -1);
b = answer.twoSum(nums, target);
for (auto n : b)
cout << n << " ";
system("pause");
return 0;
}