題目來源: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%左右。