map的使用及其解两数之和

LeetCode第一题
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

首先自己的笨方法

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
     vector<int> towSum1;
        for(int i=0;i<nums.size();i++){
       
          for(int j=0;j<nums.size();j++){
                
                if((nums[i]+nums[j]==target)&i!=j){
                    towSum1.push_back(i);
                    towSum1.push_back(j);
                    return towSum1;
                }
            }
        }
   return towSum1;
    }
};

时间效率很低,尤其,但是学了vector的相关用法,push_back()插入
以及了解了迭代器的使用

vector<int> vec;
for(vector<int>::iterator iter=vec.begin();iter!=vec.end();i++)
cout<<*iter<<endl;

其中iter是指针,相当于这个vector的位置,所以取出来的是相应的值。
然后稍微改进的方法

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
     vector<int> towSum1;
        for(int i=0;i<nums.size();i++){
       
          for(int j=i+1;j<nums.size();j++){
                
                if(nums[j] == target - nums[i]){
                    towSum1.push_back(i);
                    towSum1.push_back(j);
                    return towSum1;
                }
            }
        }
   return towSum1;
    }
};

第二次遍历从i+1开始,然后求差值来对比;

第二种方法用两次哈希表,牺牲空间换时间的方法

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        map<int,int> m;vector<int> twoSum;
        for(int i=0;i<nums.size();i++){
            m.insert(pair<int,int> (nums[i],i));
        }
        for(int i=0;i<nums.size();i++){
           
            map<int,int>::iterator iter;
             int a=target-nums[i];
            iter=m.find(a);
            if(iter!=m.end()&&iter->second!=i)
            {
                twoSum.push_back(i);
                twoSum.push_back(iter->second);
                return twoSum;
            }
               
            
                
        }return twoSum;
    }
};

首先学习了map的使用方法,其中插入使用了m.insert(pair<int,int> (nums[i],i));来插入数据。使用迭代器来查找key对应的值
iter=m.find(key);
if(iter!=m.end())来查找,注意iter要定义(同上定义迭代器)
此方法思路就是把每个vector的值和下标反过来存(key是值,value是下标),然后通过值和目标target的差是否在map的key上,这样找到key对应的value也就是下标,然后就返回两个下标就可以了。

官方解答三

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        map<int,int> m;vector<int> twoSum;
        for(int i=0;i<nums.size();i++){
            map<int,int>::iterator iter;
             int a=target-nums[i];
            iter=m.find(a);
            if(iter!=m.end()&&iter->second!=i)
            {
               
                twoSum.push_back(iter->second);
                 twoSum.push_back(i);
                return twoSum;
            }
               
            m.insert(pair<int,int>(nums[i],i));
                
        }return twoSum;
    }
};

此方法是一遍查找一遍存放,如[3,2,1,5,6] target为5,那么第一次存放的是【3,0】,第二个直接找到第一个。然后返回和上面要反过来,因为每次都是从新的一个开始找前面的,要先显示前面的下标。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值