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