给定一个整型数组,从中挑选两个数字,使其相加为一个为一个给定的值,返回这两个值所有数组中位置下标,位置下标小的在前面,位置下标从1开始。
//解法1:最简单的方法,用两层循环,算法如下,算法复杂度为O(n*n)
//这个也是最容易想到的。
vector<int> twoSum1(vector< int>& nums, int target) {
int i=0;
int count = nums.size();
while(i<count){
int j=i+1;
while(j<count){
if(nums[i]+nums[j]==target){
vector< int> r;
r.push_back(i+1); //下标+1 因为下标从1开始的
r.push_back(j+1);
return r;
}
j++;
}
i++;
}
}
//解法2:利用hash表,c++中可以使用map。时间复杂度O(n)
vector<int> twoSum2(vector< int>& nums, int target){
vector< int> result;
unordered_map< int,int > maping;
//1.用数组中nums中的值key,用下标作为value;
for (int i=0;i<nums.size();i++){
maping[nums[i]]=i;
}
for (int i=0;i<nums.size();i++){
//2.求的另一个加数
int otherNum = target-nums[i];
//3.从maping中寻找key为另一个加数的value
if(maping.find(otherNum)!=maping.end() && maping[otherNum]!=i){
result.push_back(i+1);
result.push_back(maping[otherNum]+1);
break;
}
}
return result;
}


原文:http://www.cnblogs.com/qiange/p/5090588.html