描述:
Given an array of integers, find two numbers such that they add up to a specific target number.Output: index1=1, index2=2
分析:
给定一个整型数组和一个目标值(targe),找出数组中两个值的和等于目标值(targe),然后返回下标,下标1要小于小标2 并且下标不是以0开始的。假设输入严格保证只有一个解决答案。这里有三种解决方案,第一种想法就是暴力求解,这里为了学号STL也是用两种方式解答。第二种,查看网上大神的解法是利用hash的高效查找来实现,看了涨姿势啊!第三种是稍微动动脑筋就可以想出来的,先用算法中的sort排序,再将下标和对应的值放入hash中,然后二分查找到比target小的部分,然后左右夹逼,若相加大于target,右边指针左移一位,若小右移一位。
代码:
直接复制到VS中即可。
#include "stdafx.h"
#include <vector>
#include <unordered_map>
#include <iostream>
using namespace std;
class Solution{
public:
//暴力求解
vector<int> TwoSum(vector<int> &num, int target){
vector<int>::const_iterator num_Iter1;
vector<int>::const_iterator num_Iter2;
int i=1,j=2;
vector<int> vRtn;
for (num_Iter1 = num.cbegin();num_Iter1 != num.cend();++num_Iter1){
for (num_Iter2 = num_Iter1 + 1;num_Iter2 != num.cend();++num_Iter2){
if (*num_Iter1 + *num_Iter2 == target){
vRtn.push_back(i);
vRtn.push_back(j);
break;
}
j++;
}
i++;
j = i+1;
}
return vRtn;
}
vector<int> TwoSum1(vector<int> &num, int target){
int i,j;
vector<int> vRtn;
for(i=0;i < num.size();++i){
for(j=i+1;j < num.size();++j){
if (num.at(i)+ num.at(j) == target){
vRtn.push_back(i+1);
vRtn.push_back(j+1);
break;
}
}
}
return vRtn;
}
//高效解法O(n),用一个哈希表,存储每个数对应的下标,利用hash的高效查找。
vector<int> TwoSum2(vector<int> &num, int target){
unordered_map<int, int> unmap;
vector<int> vRtn;
//先将位置存起来
for (int i=0;i< num.size();++i){
unmap[num[i]] = i;
}
int gap;
for (int i=0;i< num.size();++i){
gap = target - num[i];
if (unmap.find(gap) != unmap.end() && unmap[gap]>i){
vRtn.push_back(i+1);
vRtn.push_back(unmap[gap] + 1);
break;
}
}
return vRtn;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
vector<int> v1,v2;
v1.push_back(2);
v1.push_back(7);
v1.push_back(9);
v1.push_back(11);
v1.push_back(32);
v1.push_back(43);
Solution s;
v2 = s.TwoSum2(v1,9);
vector <int>::iterator v2_Iter;
cout << "v2 =" ;
for ( v2_Iter = v2.begin( ) ; v2_Iter != v2.end( ) ; v2_Iter++ )
cout << " " << *v2_Iter;
cout << endl;
system("pause");
return 0;
}原文:http://blog.csdn.net/z702143700/article/details/46275503