给定一个已经按升序排列的数组,找到两个数使他们加起来的和等于特定数。
函数应该返回这两个数的下标,index1必须小于index2。注意返回的值不是 0-based。
注意事项:
你可以假设每个输入刚好只有一个答案
样例:
给定数组为 [2,7,11,15] ,target = 9
返回 [1,2]
#ifndef C608_H
#define C608_H
#include<iostream>
#include<vector>
#include<map>
#include<algorithm>
using namespace std;
class Solution {
public:
/*
* @param nums: an array of Integer
* @param target: target = nums[index1] + nums[index2]
* @return: [index1 + 1, index2 + 1] (index1 < index2)
*/
vector<int> twoSum(vector<int> &nums, int target) {
// write your code here
vector<int> res(2, 0);
map<int, int> m;
int len = nums.size();
for (auto c : nums)
m[c]++;
int pos1 = 0;
//找到i,满足m中存在target-nums[i]
for (int i = 0; i < len; ++i)
{
m[nums[i]]--;
int num = target - nums[i];
if (m.find(num) != m.end() && m[num]>0)
{
pos1 = i;
break;
}
m[nums[i]]++;
}
int pos2 = 0;
//逆序查找等于target-nums[pos]的位置
for (int j = len - 1; j >= 0; --j)
{
if (nums[j] == target - nums[pos1])
{
pos2 = j;
break;
}
}
res[0] = pos1 + 1;
res[1] = pos2 + 1;
return res;
}
};
#endif