#1 两数之和

在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>{};
        }};

这里最出彩的地方就是通过逐步给关联容器赋值的操作来达到元素不会被取两次的目的。循环完成了一下目的:

  1. 一次查找
  2. 一次插入新元素
    这个插入新元素的位置非常棒!!每次循环到一个新元素之后,在这个元素之前的所有元素中查找有没有目标值(target-nums[i])。如果有的话就直接返回值,这样可以有效的避免重复!
    如果没有目标元素,那么就把这个元素插入到map中然后再进行下一轮。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值