题目来源:https://leetcode-cn.com/problems/two-sum
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
解法1:
暴力匹配,列出所有的pairs,符合条件输出即可
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
vector<int> vecres;
vecres.resize(2);
int s=nums.size();
for(int i=0;i<s;i++)
{
for(int j=i+1;j<s;j++)
{
if((nums[i]+nums[j])==target)
{
vecres[0]=i;
vecres[1]=j;
return vecres;
}
}
return vecres;
}
};
解法2:
解法1耗时太多,使用hash_map记录,提高效率。
#include <unordered_map>
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
vector<int> vecres;
vecres.resize(2);
std::unordered_map<int,int> mapint;
int s=nums.size();
for(int i=0;i<s;++i)
{
mapint[nums[i]]=i;
}
for(int i=0;i<s;i++)
{
int num2=target-nums[i];
if(mapint.find(num2)!=mapint.end())
{
if(i!=mapint[num2])//这里防止元素使用2遍
{
vecres[0]=i;
vecres[1]=mapint[num2];
return vecres;
}
}
}
return vecres;
}
};
3、官方解法
#include <unordered_map>
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
vector<int> vecres;
vecres.resize(2);
std::unordered_map<int,int> mapint;
int s=nums.size();
// for(int i=0;i<s;++i)
{
mapint[nums[i]]=i;
// }
for(int i=0;i<s;i++)
{
int num2=target-nums[i];
if(mapint.find(num2)!=mapint.end())
{
vecres[0]=i;
vecres[1]=mapint[num2];
return vecres;
}
mapint[nums[i]]=i;
}
return vecres;
}
};
从官方解法可以看出它只是遍历了一遍,而且避免了同一元素使用2次,因为使用当前元素时,当前元素并不在map里面。但是内存是打败了100%用户,效率只打败96%左右。