在leetcode上使用C++实现两数之和
map是使用空间换取时间,同时这里使用查找map中元素的算法很巧妙。
首先照例看我自己写的垃圾代码
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
map<int,int>map1;
for(int i=0;i<nums.size();i++)
map1.insert(make_pair(nums[i],i));
for(int i=0;i<nums.size();i++){
int another=target-nums[i];
if(map1.count(another))
{return vector<int>({i,map1[another]});}
}
return vector<int>{};
}};
然后我这个写法已经选取的数据会被选取第二次,选两个数据是相互独立的并没有制约关系,所以导致在一些情况下输出结果很差劲!!
这样先整个给关联容器赋值初始化然后再去使用也很浪费空间。
所以下面学习别人写的代码!!!
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
map<int,int>map1;
for(int i=0;i<nums.size();i++){
int ano=target-nums[i];
if(map1.count(ano))
return vector<int>{map1[ano],i};
map1[nums[i]]=i;
}
return vector<int>{};
}};
这里最出彩的地方就是通过逐步给关联容器赋值的操作来达到元素不会被取两次的目的。循环完成了一下目的:
- 一次查找
- 一次插入新元素
这个插入新元素的位置非常棒!!每次循环到一个新元素之后,在这个元素之前的所有元素中查找有没有目标值(target-nums[i])。如果有的话就直接返回值,这样可以有效的避免重复!
如果没有目标元素,那么就把这个元素插入到map中然后再进行下一轮。