全部程序,可以本地IDE运行
#include <stdio.h>
#include <iostream>
#include <vector>
#include <map>
using namespace std;
////M1 O(n2)
//class Solution {
//public:
// vector<int> twoSum(vector<int>& nums, int target) {
// vector<int> back;
//
// for (int i=0;i<nums.size();i++)
// {
// for (int j=i+1;j<nums.size();j++)
// {
// if(nums[i]==target-nums[j])
// {
// //back={i,j};
// back.push_back(i);
// back.push_back(j);
// return back;
// }
//
// }
// }
// }
//};
//M2: hash find with 2 round
class Solution{
public:
vector<int> twoSum(vector<int>& nums, int target)
{
vector<int> result;
map<int, int> m;
for (int i=0;i<nums.size();i++ )
{
m[nums[i]]=i;
}
for (int i=0;i<nums.size();i++)
{
//m[nums[i]]=i;
if (m.count(target-nums[i]) && m[target-nums[i]]!=i )
{
result.push_back(i);
result.push_back(m[target-nums[i]]);
return result;
}
}
}
};
////M3:hash find with 1 round
//class Solution{
//public:
// vector<int> twoSum(vector<int>& nums, int target)
// {
// vector<int> result;
// map<int, int> m;
// for (int i=0;i<nums.size();i++)
// {
// m[nums[i]]=i;
// if (m.count(target-nums[i]) && m[target-nums[i]]!=i )
// {
// result.push_back(m[target-nums[i]]);
// result.push_back(i);
// return result;
// }
//
// }
// }
//};
int main()
{
Solution solution;
vector<int>vv1;//={2,7,11,15};
vector<int>vv2;
vector<int>::iterator ite;
/*
vv1.push_back(2);
vv1.push_back(7);
vv1.push_back(11);
vv1.push_back(15);
*/
int i;
int nums[]={21, 7, 2, 15};
for (i=0;i<sizeof(nums)/sizeof(nums[0]);i++)
{
vv1.push_back(nums[i] );
}
//int nums[]={2, 7, 11, 15};
int taget=9;
vv2=solution.twoSum(vv1,taget);
for(vector<int>::iterator iter=vv2.begin(); iter!=vv2.end(); ++iter)
{ cout<<*iter<<" ";}return 0;
}
M1 内外两层循环,可以通过但是时间太慢
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
vector<int> back;
for (int i=0;i<nums.size();i++)
{
for (int j=i+1;j<nums.size();j++)
{
if(nums[i]==target-nums[j])
{
back={i,j};
return back;
}
}
}
}
};
M2 使用hash表,对应下标为值的map,随后将给定的整数与vector中元素相减,若map中存在成员,其键等于相减得到的余数,则说明找到了符合要求的两个成员
创建hash表:
for (int i=0;i<nums.size();i++ )
{
m[nums[i]]=i;
}
map.count(x) 判断map中是否存在x,存在则返回1,否则返回0
class Solution{
public:
vector<int> twoSum(vector<int>& nums, int target)
{
vector<int> result;
map<int, int> m;
for (int i=0;i<nums.size();i++ )
{
m[nums[i]]=i;
}
for (int i=0;i<nums.size();i++)
{
//m[nums[i]]=i;
if (m.count(target-nums[i]) && m[target-nums[i]]!=i )
{
result.push_back(i);
result.push_back(m[target-nums[i]]);
return result;
}
}
}
};