lower_bound使用

在 非递减序列中 找到 第一个大于或者等于 某个元素的位置,如果找得到,返回相应的迭代器,否则,返回范围中的尾迭代器。

使用示例

https://leetcode.cn/problems/longest-increasing-subsequence/

int pos = lower_bound(d.begin(), d.end(), nums[i]) - d.begin();
d[pos] = nums[i];

自定义优先队列


https://leetcode.cn/submissions/detail/326788137/

自定义sort方法

sort(envelopes.begin(), envelopes.end(), [](const auto& e1, const auto& e2) {
return e1[0] < e2[0] || (e1[0] == e2[0] && e1[1] > e2[1]);
});

LeetCode 第 1 号问题:两数之和(暴力解、哈希表)

c++ vector

  • vector 是向量类型,它可以容纳许多类型的数据,如若干个整数,所以称其为容器。vector 是C++ STL的一个重要成员,使用它时需要包含头文件:

    #include<vector>;

  • vector 的初始化:可以有五种方式,举例说明如下:

    (1) vector a(10); //定义了10个整型元素的向量(尖括号中为元素类型名,它可以是任何合法的数据类型),但没有给出初值,其值是不确定的。
    (2)vector a(10,1); //定义了10个整型元素的向量,且给出每个元素的初值为1
    (3)vector a(b); //用b向量来创建a向量,整体复制性赋值
    (4)vector a(b.begin(),b.begin+3); //定义了a值为b中第0个到第2个(共3个)元素
    (5)int b[7]={1,2,3,4,5,9,8};
    vector a(b,b+7); //从数组中获得初值
    (6)vector vec1{ 1, 2, 3, 4, 5, 6 }; //vec1内容1,2,3,4,5,6

c++ for循环

  • 可以在初始化部分中声明变量。如for (int i = 0; ;)

返回vector类型

  • 可直接return {i,j}; 或 return {,};

  • capacity,如果不重新分配内存,当前已经分配的可以容纳的元素的个数.
    max_size最大的可能的元素个数.
    size是当前元素个数
    sizeof是vector本身的大小(sizeof(vector))
    int len=sizeof(arr)/size(arr[0])

引用作函数参数

  • vector& nums 引用

哈希表

unordered_map: unordered_map内部实现了一个哈希表,因此其元素的排列顺序是杂乱的,无序的

最初的 C++ 标准库中没有类似 hash_map 的实现,但不同实现者自己提供了非标准的 hash_map。 因为这些实现不是遵循标准编写的,所以它们在功能和性能保证方面都有细微差别。从 C++ 11 开始,hash_map 实现已被添加到标准库中。但为了防止与已开发的代码存在冲突,决定使用替代名称 unordered_map。这个名字其实更具描述性,因为它暗示了该类元素的无序性。

C++ 11标准中加入了unordered系列的容器。unordered_map记录元素的hash值,根据hash值判断元素是否相同。map相当于java中的TreeMap,unordered_map相当于HashMap。无论从查找、插入上来说,unordered_map的效率都优于hash_map,更优于map;而空间复杂度方面,hash_map最低,unordered_map次之,map最大。

unordered_map与map的对比:

  存储时是根据key的hash值判断元素是否相同,即unordered_map内部元素是无序的,而map中的元素是按照二叉搜索树存储(用红黑树实现),进行中序遍历会得到有序遍历。所以使用时map的key需要定义operator<。而unordered_map需要定义hash_value函数并且重载operator==。但是很多系统内置的数据类型都自带这些。

  总结:结构体用map重载<运算符,结构体用unordered_map重载==运算符。

unordered_map与hash_map对比:

  unordered_map原来属于boost分支和std::tr1中,而hash_map属于非标准容器。
  unordered_map感觉速度和hash_map差不多,但是支持string做key,也可以使用复杂的对象作为key。
  unordered_map编译时gxx需要添加编译选项:—std=c++11

unordered_map模板:

1 template < class Key,                                    // unordered_map::key_type
2 class T, // unordered_map::mapped_type
3 class Hash = hash<Key>, // unordered_map::hasher
4 class Pred = equal_to<Key>, // unordered_map::key_equal
5 class Alloc = allocator< pair<const Key,T> > // unordered_map::allocator_type
6 > class unordered_map;

迭代器:

unordered_map的迭代器是一个指针,指向这个元素,通过迭代器来取得它的值。

1 unordered_map<Key,T>::iterator it;
2 (*it).first; // the key value (of type Key)
3 (*it).second; // the mapped value (of type T)
4 (*it); // the "element value" (of type pair<const Key,T>)

它的键值分别是迭代器的first和second属性。

1 it->first;               // same as (*it).first   (the key value)
2 it->second; // same as (*it).second (the mapped value)

成员函数:

=================迭代器=========================
begin   返回指向容器起始位置的迭代器(iterator)
end    返回指向容器末尾位置的迭代器
cbegin  返回指向容器起始位置的常迭代器(const_iterator)
cend    返回指向容器末尾位置的常迭代器
=================Capacity================
size   返回有效元素个数
max_size 返回 unordered_map 支持的最大元素个数
empty 判断是否为空
=================元素访问=================
operator[]   访问元素
at      访问元素
=================元素修改=================
insert   插入元素
erase   删除元素
swap    交换内容
clear   清空内容
emplace  构造及插入一个元素
emplace_hint 按提示构造及插入一个元素
================操作=========================
find       通过给定主键查找元素,没找到:返回unordered_map::end
count      返回匹配给定主键的元素的个数
equal_range   返回值匹配给定搜索值的元素组成的范围
================Buckets======================
bucket_count    返回槽(Bucket)数
max_bucket_count 返回最大槽数
bucket_size     返回槽大小
bucket       返回元素所在槽的序号
load_factor     返回载入因子,即一个元素槽(Bucket)的最大元素数
max_load_factor   返回或设置最大载入因子
rehash       设置槽数
reserve       请求改变容器容量

https://www.cnblogs.com/langyao/p/8823092.html


LeetCode 第 15 号问题:三数之和(排序+双指针)