前言:
研一了,提前刷刷leetcode,为以后找工作打基础。
题意:
在数组中找出两个数相加为target,并返回这两个数的索引
要求:
1.索引小的在前
2.找出一组即可
思路1,最早想到的肯定是2重循环搜索,提交后超时,这里也贴出代码:
class Solution{
public:
Solution(){}
vector<int> twoSum(vector<int>& nums, int target){
//alg1
//brute force: Time Limit Exceeded
vector<int> ret;
if(nums.size()<=1)
return ret;
vector<int>::iterator it1;
vector<int>::iterator it2;
for(it1=nums.begin();it1!=nums.end()-1;it1++)
{
for(it2=it1+1;it2!=nums.end();it2++)
{
if(*it1 + *it2 == target)
{
ret.push_back(it1-nums.begin()+1);
ret.push_back(it2-nums.begin()+1);
return ret;
}
}
}
}
};
在数组中遍历x1,那么如果x1+x2=target,且x2在数组中,则target-x1在数组中,那么在一重循环中,依次判断key为target-x1
是否存在,存在即返回index,此时x1的index也可以通过map求出。
这个时候只需要调整一下index的大小关系即可。
代码:
class Solution{
private:
void swap(int &index1,int&index2)
{
int temp;
temp=index1;
index1=index2;
index2=temp;
}
public:
//Solution(){}
vector<int> twoSum(vector<int>& nums, int target)
{
map<int,int> myMap;
vector<int>result;
int index1;
int index2;
for(int i= 0;i<nums.size();i++)
{
myMap.insert(pair<int,int>(nums[i],i));
}
vector<int>::iterator it;
for(it=nums.begin();it!=nums.end();it++)
{
int number = target - *it;
if(myMap.find(number)!=myMap.end())
{
index1=it-nums.begin()+1;
index2=myMap.find(number)->second + 1;
if(index1>index2)
{
swap(index1,index2);
}
else if(index1 == index2)
{
continue;
}
result.push_back(index1);
result.push_back(index2);
return result;
}
}
return result;
}
};
附:
由于leetcode都是提交class,测试用的main函数需要自己编写:
int main()
{
Solution sol;
vector<int>nums;
nums.push_back(3);
nums.push_back(2);
nums.push_back(4);
// nums.push_back(15);
int target = 6;
vector<int>result=sol.twoSum(nums,target);
vector<int>::iterator it;
for(it=result.begin();it!=result.end();it++)
{
cout<<*it<<" ";
}
cout<<endl;
return 0;
}
后记:
以后会慢慢把leetcode做完,可能会很慢,但是会坚持:
i walk slowly,but never back up