一、题目
中文:
二、代码
1、暴力法
暴力法很简单。遍历每个元素。
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
int n=nums.size();
vector<int> result;
for(int i=0;i<n-1;i++)
{
for(int j=i+1;j<n;j++)
{
int sum=nums[i]+nums[j];
if(sum==target){
result.push_back(i);
result.push_back(j);
break;
}
}
}
return result;
}
};
性能:
复杂度分析:
时间复杂度:O(n^2), 对于每个元素,我们试图通过遍历数组的其余部分来寻找它所对应的目标元素,这将耗费 O(n)的时间。因此时间复杂度为 O(n^2)。
空间复杂度:O(1)。
2、哈希表
用一个哈希表存储每个数对应的下标。
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int,int> mapping;
vector<int> result;
for(int i=0;i<nums.size();i++){
mapping[nums[i]]=i;//用unordered_map先把数组中的数字和对应的下标存储一遍,即数字作为键,下标作为值存储。
}
for(int i=0;i<nums.size();i++){
const int gap=target-nums[i];//遍历数组的时候用target-nums[i],得到差gap,然后在nordered_map中找是否存在gap,找到即返回gap所在的值,即所对应的数组的下标。
if(mapping.find(gap)!=mapping.end()&&mapping[gap]>i){
result.push_back(i);
result.push_back(mapping[gap]);
break;
}
}
return result;
}
};
性能:
复杂度分析:
时间复杂度:O(n)。
空间复杂度:O(n)。
三、知识点解析
1、map、hash_map、unordered_map的区别
http://www.cnblogs.com/ranjiewen/p/5328137.html
https://blog.youkuaiyun.com/zhc_24/article/details/78915968
2、mapping.find(gap)!=mapping.end()的解析
https://www.cnblogs.com/fnlingnzb-learner/p/5833051.html
用find函数来定位数据出现位置,它返回的一个迭代器,当数据出现时,它返回数据所在位置的迭代器,如果map中没有要查找的数据,它返回的迭代器等于end函数返回的迭代器。
查找map中是否包含某个关键字条目用find()方法,传入的参数是要查找的key,在这里需要提到的是begin()和end()两个成员,
分别代表map对象中第一个条目和最后一个条目,这两个数据的类型是iterator.