Two Sum

前天开始刷leetcode,所以打算把代码和一些思路写在这里吧。本身自己就是菜鸟,就从easy开始做,大部分都是可以直接想到思路的。先把这几天的上传上来。

#1

Two Sum

给出整型数组和一个数,找到数组中两个相加为该数的不同数的索引,答案唯一。

1、暴力法

暴力法就是逐个去遍历该元素和后面的元素之和,找到则返回即可。

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

2、哈希表

unordered_map<>

map内部实现的是红黑树(非严格平衡二叉树,AVL是严格平衡二叉树),元素存放有序。map中的元素是按照二叉搜索树进行存放(左子树节点的值小于根节点的值,右子树的值大于根节点的值)。因此对map使用中序遍历就可以从小到大遍历了。

unordered_map内部实现的其实是一个哈希表,查找复杂度O(1),元素存放是无序的。

相关方法:

1)使用{}赋值,map<int,string> Mymap={{1,''你好''},{2,''大家好''}};

2)访问:Mymap[键值]

3)使用pair插入:Mymap.insert(pair<int,string>(3,''再见''))

4)使用find查找,若找到则返回迭代器指向键值为key的元素,若没有找到,则返回end()

      it=Mymap.find(2); *it输出“大家好”即可。 查找是通过键key查找的!!

对于该题,想法就是插入补数(target-数组元素):遍历,先查找哈希表中有无该数的键,若没有,则插入索引和该数的补数组成的pair<int,int>第一个是补数,第二是索引(因为结果是要找到索引,所以索引才是我们关注的value)。若有,则通过键去访问value得到索引即可。

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        
       //使用hash表
        
        std::unordered_map<int, int> hash_map;
        std::pair<int,int>pairs;
        int numSize=nums.size();
        vector<int> resultNum;
        for(int i=0;i<numSize;i++)
        {
            if(hash_map.find(nums[i])!=hash_map.end())  //通过键值key查找,若找到插值
            {
                //resultNum[0]=hash_map.find(nums[i]); //查找成功,返回key迭代器
                resultNum.push_back(hash_map[nums[i]]);//查找成功,用键值去访问读取value值
                resultNum.push_back(i);
                return resultNum;
            }
            else
            {
                //没找到,则插入pair,其值是target与num的差值
                pairs.first=target-nums[i];
                pairs.second=i;
                hash_map.insert(pairs);
                
            }
        }
        return resultNum;
    }
};

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值