1.LeetCode 两数之和

#1.两数之和
##一、思路:
暴力算法是O(n^2)的枚举,如果用哈希表,枚举一个数同时,在哈希表中查询 target - nums[i] 是否在表中,如果在,那就是找到了答案{heap[nums[i]], i}。将该数也加入到哈希表中,开始下一次循环。
###1、哈希表的实现:

unordered_map<int, int> heap;//c++11

##2、关于unordered_map
unordered_map 容器,直译过来就是"无序 map 容器"的意思(map 底层是平衡树)。所谓“无序”,指的是 unordered_map 容器不会像 map 容器那样对存储的数据进行排序。换句话说,unordered_map 容器和 map 容器仅有一点不同,即 map 容器中存储的数据是有序的,而 unordered_map 容器中是无序的。具体来讲,unordered_map 容器和 map 容器一样,以键值对(pair类型)的形式存储数据,存储的各个键值对的键互不相同且不允许被修改。但由于 unordered_map 容器底层采用的是哈希表存储结构,该结构本身不具有对数据的排序功能,所以此容器内部不会自行对存储的键值对进行排序。

template < class Key,                        //键值对中键的类型
           class T,                          //键值对中值的类型
           class Hash = hash<Key>,           //容器内部存储键值对所用的哈希函数
           class Pred = equal_to<Key>,       //判断各个键值对键相同的规则
           class Alloc = allocator< pair<const Key,T> >  // 指定分配器对象的类型
           > class unordered_map;
           //以上 5 个参数中,必须显式给前 2 个参数传值,并且除特殊情况外,最多只需要使用前 4 个参数

通过调用 unordered_map 模板类的默认构造函数,可以创建空的 unordered_map 容器

std::unordered_map<std::string, std::string> umap;
成员方法功能
begin()返回指向容器中第一个键值对的正向迭代器。
end()返回指向容器中最后一个键值对之后位置的正向迭代器。
empty()若容器为空,则返回 true;否则 false。
size()返回当前容器中存有键值对的个数。
at(key)返回容器中存储的键 key 对应的值,如果 key 不存在,则会抛出 out_of_range 异常。
find(key)查找以 key 为键的键值对,如果找到,则返回一个指向该键值对的正向迭代器;反之,则返回一个指向容器中最后一个键值对之后位置的迭代器(如果 end() 方法返回的迭代器)。
count(key)在容器中查找以 key 键的键值对的个数。
clear()清空容器,即删除容器中存储的所有键值对。
erase()删除指定键值对。
emplace()向容器中添加新键值对(构造及插入一个元素),效率比 insert() 方法高。
emplace_hint()向容器中添加新键值对(按提示构造及插入一个元素),效率比 insert() 方法高。
insert()向容器中添加新键值对。

##二、代码:

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        unordered_map<int, int> heap;
        for(int i = 0; i < nums.size(); i ++){
            int r = target - nums[i];
            if(heap.count(r)) return {heap[r], i};
            heap[nums[i]] = i;
        }
        return {};
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值