给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出和为目标值 target 的那两个整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
1.暴力法 双重循环 O(n)=n*n (368ms)
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
//从第一个开始找 依次向后匹配
for(int i = 0;i<nums.size()-1;i++)
{
for(int j = i+1;j<nums.size();j++)
{
if(nums[i]+nums[j]==target)
{
return {i,j};
}
}
}
//未找到
return {};
}
};
2.HashMap O(n)=n (8ms)
题解:本题主要就是为了发现是否存在另一个数,和一个nums[i]相加等于target,就是寻找target-x。因此:可以使用HashMap,每次循环搜索HashMap中是否存在target-nums[i],如果存在可以直接找到,使用哈希表,可以将寻找target-x的时间复杂度降低到从 O(N) 降低到 O(1)。本题推荐使用无序HashMap存储,因为nums是无序的。
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int,int> hashmap;
for(int i=0;i<nums.size();i++)
{
//存储前先开始在HashMap中寻找
auto it = hashmap.find(target-nums[i]);
if(it!=hashmap.end())//说明已找到
{
return {it->second,i};
}
//如果未找到,存储到HashMap中
hashmap[nums[i]]=i;
}
return {};
}
};
有人相爱,有人夜里开车看海,有人leetcode第一题都做不出来。 ---2022.9.22