1、Two Sum 两数之和
案例:
Given nums = [2, 7, 11, 15], target = 9,
Because nums[0] + nums[1] = 2
- 7 = 9, return [0, 1]
思路:
使用一个HashMap,来建立数字和其坐标位置之间的映射,我们都知道HashMap是常数级的查找效率,这样,我们在遍历数组的时候,用target减去遍历到的数字,就是另一个需要的数字了,直接在HashMap中查找其是否存在即可,注意要判断查找到的数字不是第一个数字,比如target是4,遍历到了一个2,那么另外一个2不能是之前那个2,整个实现步骤为:先遍历一遍数组,建立HashMap映射,然后再遍历一遍,开始查找,找到则记录index。
#include <iostream>
#include <string.h>
#include <map>
#include <vector>
using namespace std;
class Solution
{
public:
vector<int> twoSum(vector<int>&nums, int target)
{
map<int, int> m;
vector<int> res;
for (int i = 0; i < nums.size(); ++i)
{
m[nums[i]] = i; //key 为数组的值
}
for (int i = 0; i < nums.size(); ++i)
{
int t = target - nums[i];//
if (m.count(t) && m[t] != i) //差如果在Map里面说明找到了,把下标放到vector里面就OK了
{
res.push_back(i);
res.push_back(m[t]);
break;
}
}
return res;
}
};
int main()
{
vector<int>vec;
vec.push_back(10);
vec.push_back(70);
vec.push_back(2);
vec.push_back(5);
vec.push_back(11);
vec.push_back(6);
Solution s;
vector<int> vec1 = s.twoSum(vec,76);
for(vector<int>::iterator it = vec1.begin();it !=vec1.end();it++)
{
cout<<*it<<endl;
}
system("pause");
return 0;
}