Given an array of integers, return indices of the two numbers such that they add up to a specific target.
You may assume that each input would have exactly one solution, and you may not use the same element twice.
Example:
Given nums = [2, 7, 11, 15], target = 9,
Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1].
解法1:首先将nums备份得到temp,然后对nums排序,使用start和end两个指针进行遍历,找到满足和为target的两个数,再在temp中找到两个数对应的下标。代码见twoSum
解法2:使用无序的地图存储数据,然后查找。代码见twoSum2
#include "stdafx.h"
#include<iostream>
#include<string>
#include<vector>
#include<algorithm> //调用vector的sort函数
#include<unordered_map>
using namespace std;
class Solution{
public:
vector<int>twoSum(vector<int>& nums,int target) //排序,使用两个指针寻找
{
vector<int> result;
if(nums.size()==0) return result;
vector<int> temp=nums; //备份
sort(nums.begin(),nums.end()); //升序排序
int start=0,end=nums.size()-1;
while(start<end)
{
if(nums[start]+nums[end]==target) //找到两个数
{
for(int i=0;i<temp.size();i++) //寻找对应的下标
{
if(temp[i]==nums[start]) result.push_back(i);
if(temp[i]==nums[end]) result.push_back(i);
if(result.size()==2) return result;
}
}
if(nums[start]+nums[end]<target) start++; //没有找到,则指针移位
if(nums[start]+nums[end]>target) end--;
}
return result;
}
vector<int> twoSum2(vector<int>& nums,int target)
{
vector<int> result;
if(nums.size()==0) return result;
unordered_map<int,int> m;
for(int i=0;i<nums.size();i++)
{
if(m.find(target-nums[i])!=m.end())
{
result.push_back(m[target-nums[i]]);
result.push_back(i);
return result;
}
else m[nums[i]]=i; //map中存储各数据的下标
}
}
};
int _tmain(int argc, _TCHAR* argv[])
{
Solution solu;
int num[]={2,7,11,15,14,16,18,13};
int target=0;
vector<int> nums;
for(int i=0;i<sizeof(num)/sizeof(int);i++)
{
nums.push_back(num[i]);
}
vector<int> result=solu.twoSum2(nums,target);
if(!result.empty())
{
vector<int>::iterator it=result.begin();
while(it!=result.end())
{
cout<<*it<<endl;
it++;
}
}
getchar();
getchar();
return 0;
}