images\cherry_red.png1 Leetcodegaogaotwo
      images\cherry_blue.png1.1 链表
         images\cherry_orange.png1.1.1 分割链表
         images\cherry_orange.png1.1.2 反转链表
         images\cherry_orange.png1.1.3 快慢指针 链表的中间节点
         images\cherry_orange.png1.1.4 链表的倒数第k个节点
         images\cherry_orange.png1.1.5 回文链表
         images\cherry_orange.png1.1.6 链表的删除
         images\cherry_orange.png1.1.7 链表反转2
         images\cherry_orange.png1.1.8 链表的第一个相交节点
      images\cherry_blue.png1.2 dfs
         images\cherry_orange.png1.2.1 岛屿数量
         images\cherry_orange.png1.2.2 机器人的运动范围
         images\cherry_orange.png1.2.3 字符串的全排列(回溯算法)
         images\cherry_orange.png1.2.4 判断一个数字是否可以表示成三的幂的和
         images\cherry_orange.png1.2.5 不同路径III dfs+回溯
         images\cherry_orange.png1.2.6 组合总和 dfs+回溯
         images\cherry_orange.png1.2.7 子集 dfs or 状态枚举
      images\cherry_blue.png1.3 bfs
      images\cherry_blue.png1.4 双指针
         images\cherry_orange.png1.4.1 奇数在前,偶数在后
      images\cherry_blue.png1.5 二维矩阵的前缀和
         images\cherry_orange.png1.5.1 1074. 元素和为目标值的子矩阵数量
         images\cherry_orange.png1.5.2 304. 二维区域和检索 - 矩阵不可变
      images\cherry_blue.png1.6 数组变化
         images\cherry_orange.png1.6.1 大数加减法
         images\cherry_orange.png1.6.2 717. 1 比特与 2 比特字符
      images\cherry_blue.png1.7 排序算法
         images\cherry_orange.png1.7.1 把数组排成最小的数
         images\cherry_orange.png1.7.2 根据字符出现的次数频率进行排序
         images\cherry_orange.png1.7.3 最大数
         images\cherry_orange.png1.7.4 969. 煎饼排序
      images\cherry_blue.png1.8 dp动态规划
         images\cherry_orange.png1.8.1 斐波那契数列
         images\cherry_orange.png1.8.2 俄罗斯套娃信封问题
         images\cherry_orange.png1.8.3 分割回文串
         images\cherry_orange.png1.8.4 01背包
         images\cherry_orange.png1.8.5 打家劫舍II
         images\cherry_orange.png1.8.6 青蛙过河
         images\cherry_orange.png1.8.7 最长回文子串
         images\cherry_orange.png1.8.8 目标和 (01背包)
         images\cherry_orange.png1.8.9 最大子序和
      images\cherry_blue.png1.9 滑动窗口
         images\cherry_orange.png1.9.1 绝对差不超过限制的最长连续子数组
         images\cherry_orange.png1.9.2 三数之和
      images\cherry_blue.png1.10 二叉树性质
         images\cherry_orange.png1.10.1 二叉树的最小深度
         images\cherry_orange.png1.10.2 二叉树的层次遍历
         images\cherry_orange.png1.10.3 二叉树的镜像翻转
         images\cherry_orange.png1.10.4 二叉树的最大深度
         images\cherry_orange.png1.10.5 二叉搜索树节点最小距离
         images\cherry_orange.png1.10.6 二叉树重构从小到达 按照->right情况
         images\cherry_orange.png1.10.7 二叉搜索数的范围和
         images\cherry_orange.png1.10.8 N叉树的前序遍历
      images\cherry_blue.png1.11 递归
         images\cherry_orange.png1.11.1 1+2...+n
      images\cherry_blue.png1.12 并查集
         images\cherry_orange.png1.12.1 并查集连通分量
         images\cherry_orange.png1.12.2 并查集城市连通
      images\cherry_blue.png1.13 堆栈
         images\cherry_orange.png1.13.1 通过队列来实现栈
         images\cherry_orange.png1.13.2 下一个更大元素 II
         images\cherry_orange.png1.13.3 删除字符串中的所有相邻重复项
         images\cherry_orange.png1.13.4 基本计算机
         images\cherry_orange.png1.13.5 计算机
         images\cherry_orange.png1.13.6 逆波兰表达式
         images\cherry_orange.png1.13.7 接雨水
         images\cherry_orange.png1.13.8 柱状图中最大矩形面积
         images\cherry_orange.png1.13.9 反转每对括号间的子串
      images\cherry_blue.png1.14 队列(or 优先队列)
         images\cherry_orange.png1.14.1 最大平均通过率
         images\cherry_orange.png1.14.2 最大的团队表现值
         images\cherry_orange.png1.14.3 找出第K大的异或坐标值
         images\cherry_orange.png1.14.4 1.2滑动窗口的最大值
         images\cherry_orange.png1.14.5 二叉搜索数的范围和
         images\cherry_orange.png1.14.6 员工的重要性
      images\cherry_blue.png1.15 Hash查询匹配
         images\cherry_orange.png1.15.1 猜灯谜
         images\cherry_orange.png1.15.2 720. 词典中最长的单词
      images\cherry_blue.png1.16 前缀树
         images\cherry_orange.png1.16.1 实现Trie(前缀树)
         images\cherry_orange.png1.16.2 添加与搜索单词 - 数据结构设计
      images\cherry_blue.png1.17 位运算
         images\cherry_orange.png1.17.1 比特位计数
         images\cherry_orange.png1.17.2 不用加减乘除做加法
         images\cherry_orange.png1.17.3 可被 5 整除的二进制前缀
         images\cherry_orange.png1.17.4 汉明距离总和
      images\cherry_blue.png1.18 二分法
         images\cherry_orange.png1.18.1 在D天内送达包裹的能力
         images\cherry_orange.png1.18.2 第一个错误的版本
      images\cherry_blue.png1.19 数据结构性质
      images\cherry_blue.png1.20 回溯法思想
      images\cherry_blue.png1.21 字符串处理(模拟)
         images\cherry_orange.png1.21.1 Excel 表列序号进制转换
         images\cherry_orange.png1.21.2 838.推多米诺
      images\cherry_blue.png1.22 模拟
      images\cherry_blue.png1.23 数学定理
         images\cherry_orange.png1.23.1 1828. 统计一个圆中点的数目
双向队列

deque<>q;

q.empty() 判断队列是否为空

q.front() 返回队头属性
q.back() 返回队尾属性

q.pop_front() 弹出队头元素
q.pop_back() 弹出队尾元素

q.push_front() 从队列头添加元素
q.push_back() 从队列尾部添加元素


优先队列 大小根堆
priority_queue<结构类型> 队列名; 自动排序 默认从大到小排序

q.size();//返回q里元素个数
q.empty();//返回q是否为空,空则返回1,否则返回0
q.push(k);//在q的末尾插入k
q.pop();//删掉q的第一个元素
q.top();//返回q的第一个元素

priority_queue <int,vector<int>,less<int> > p; // 大顶堆
<int,vector<int>,greater<int> > q; // 小顶堆

struct node
{
int x,y;
node(int a,int b){
x = a,y = b;
}
bool operator < (const node & t) const //函数重载
{
return x-t.x < 0 降序
}
};




string

back() 返回尾巴

front() 返回头

pop_back() 尾巴弹出

push_back() 压入尾巴

erase(pos) 从 字符串下标 pos开始删除,一直到结尾
erase(pos,len) 从 字符串下标 pos开始删除len个长度字符

s.compare(xxx) 字符串比较,若相等则返回值为零

substr有2种用法:
假设:string s = "0123456789";
string sub1 = s.substr(5); //只有一个数字5表示从下标为5开始一直到结尾:sub1 = "56789"
string sub2 = s.substr(5, 3); //从下标为5开始截取长度为3位:sub2 = "567"
返回值: string,包含s中从pos开始的len个字符的拷贝。pos的默认值是0,len的默认值是s.size() - pos,即不加参数会默认拷贝整个s。
substr(size_type _Off = 0,size_type _Count = npos)
异常 :若pos的值超过了string的大小(注意是超过了,并不是等于,并且它会自动的去调整),则substr函数会抛出一个out_of_range异常;若pos+n的值超过了string的大小,则substr会调整n的值,只拷贝到string的末尾


vector
(1)a.assign(b.begin(), b.begin()+3);
//b为向量,将b的0~2个元素构成的向量赋给a
(2)a.assign(4,2); //是a只含4个元素,且每个元素为2
(3)a.back(); //返回a的最后一个元素
(4)a.front(); //返回a的第一个元素
(5)a[i]; //返回a的第i个元素,当且仅当a[i]存在2013-12-07
(6)a.clear(); //清空a中的元素
(7)a.empty(); //判断a是否为空,空则返回ture,不空则返回false
(8)a.pop_back(); //删除a向量的最后一个元素
(9)a.erase(a.begin()+1,a.begin()+3); //删除a中第1个(从第0个算起)到第2个元素,也就是说删除的元素从a.begin()+1算起(包括它)一直到a.begin()+ 3(不包括它)
(10)a.push_back(5); //在a的最后一个向量后插入一个元素,其值为5
(11)a.insert(a.begin()+1,5); //在a的第1个元素(从第0个算起)的位置插入数值5,如a为1,2,3,4,插入元素后为1,5,2,3,4
(12)a.insert(a.begin()+1,3,5); //在a的第1个元素(从第0个算起)的位置插入3个数,其值都为5
(13)a.insert(a.begin()+1,b+3,b+6); //b为数组,在a的第1个元素(从第0个算起)的位置插入b的第3个元素到第5个元素(不包括b+6),如b为1,2,3,4,5,9,8 ,插入元素后为1,4,5,9,2,3,4,5,9,8
(14)a.size(); //返回a中元素的个数;
(15)a.capacity(); //返回a在内存中总共可以容纳的元素个数
(16)a.resize(10); //将a的现有元素个数调至10个,多则删,少则补,其值随机
(17)a.resize(10,2); //将a的现有元素个数调至10个,多则删,少则补,其值为2
(18)a.reserve(100); //将a的容量(capacity)扩充至100,也就是说现在测试a.capacity();的时候返回值是100.这种操作只有在需要给a添加大量数据的时候才 显得有意义,因为这将避免内存多次容量扩充操作(当a的容量不足时电脑会自动扩容,当然这必然降低性能)
(19)a.swap(b); //b为向量,将a中的元素和b中的元素进行整体性交换
(20)a==b; //b为向量,向量的比较操作还有!=,>=,<=,>,<


vector<string> xxx 去重 or vector<vector<int>>xxx
需要sort()排序
ans.erase(unique(ans.begin(),ans.end()),ans.end());

"unique"是C++语言中的STL函数,包含于<algorithm>头文件中。功能是将数组中相邻的重复元素去除。
配合erase 进行相关删除操作
, 其本质是将重复的元素移动到数组的末尾,
返回迭代器指向第一个重复元素的下标。


取容器内部最大值
int mx = *max_element(nums.begin(), nums.end());

sort(s.begin(),s.end(),[](string &a,string &b){ return a+b>b+a;});


队列

queue<>q;

q.pop() 弹出队列头
q.push() 压入队尾
q.front() 队列头元素
q.back() 队列尾元素


stack常用函数实例解析

(1)push()
push(x)将x入栈,时间复杂度为O(1),实例见“ stack容器内元素的访问”。

(2)top()
top()获得栈顶元素,时间复杂度为O(1),实例见“ stack容器内元素的访问”。

(3)pop()
pop()用以弹出栈顶元素,时间复杂度为O(1)

(4)peek() 返回栈顶元素并且 不删除


红黑树的平衡二叉检索树的数据结构(set)无重复值
multiset篇(平衡二叉树,允许重复值)
这里使用multiset维护一个滑动窗口,用multiset的好处是自动排序,所以在计算是否超出限制时,直接把multiset的头和尾相减即可进行判断,multiset的缺点就是太耗费内存了,但是为了更好理解本题,牺牲一下内存也是可以理解的

multiset<>st *st.rbegin() 返回一个逆向迭代器,指向逆向迭代的第一个元素
*st.begin() 返回一个随机存取迭代器,指向第一个元素
st.insert(...) 插入元素
st.erase(...) 移除元素 位置 or 元素
st.find(...) 返回元素值为elem的第一个元素,如果没有返回end()

/*
删除头元素
mt.erase(mt.begin());
删除尾元素
mt.erase(std::prev(mt.end()));

遍历序列元素
for(auto it = mt.begin(); it != mt.end(); it++){
avg += *it;
}




【优点、缺点、使用场景】
map
优点:有序性,可以简化很多操作,效率较高
缺点:空间占用率高,因为为了保存有序性,需要额外保存父节点,孩子结点以及红黑性质,使得每一个节点都占用大量的空间。
适用性:对于顺序要求高的问题,使用map会更加高效一些
unordered_map
优点:内部实现了哈希表,因此查找速度非常快
缺点:哈希表的建立时间比较耗时
适用性:对于查找问题更加高效。
*/

完成类似这样的调用!
unordered_map<int, vector<int>> pos;
auto &res = pos[target];
return res[rand() % res.size()];

1. //遍历输出 umap 容器中所有的键值对
2. for (auto iter = umap.begin(); iter != umap.end(); ++iter) {
3. cout << "<" << iter->first << ", " << iter->second << ">" << endl;
4. }


An=A1+(n-1)d
An=Am+(n-m)d
d是公差
等差数列的前n项和:
Sn=[n(A1+An)]/2
Sn=nA1+[n(n-1)d]/2

反转数字
int rev(int num){
int res = 0;
while(num != 0){
res = (num % 10) + (res * 10);
num /= 10;
}
return res;
}


unordered_map< , >xx
=================迭代器========================= 
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        请求改变容器容量
————————————————



unordered_set 哈希表
unordered_set的迭代器
函数声明 功能介绍
begin 返回unordered_set第一个元素的迭代器
end 返回unordered_set最后一个元素下一个位置的迭代器
cbegin 返回unordered_set第一个元素的const迭代器
cend 返回unordered_set最后一个元素下一个位置的const迭代器
4、unordered_set的操作
函数声明 功能介绍
bool empty() const 检测unordered_set是否为空
size_t size() const 获取unordered_set的有效元素个数
iterator find(const key_type& k) 返回k在哈希桶中的位置
size_t count(const key_type& k) 返回哈希桶中关键码为k的键值对的个数
insert 向容器中插入键值对
erase 删除容器中的键值对
void clear() 清空容器中有效元素个数
void swap(unordered_set&) 交换两个容器中的元素
size_t bucket_count()const 返回哈希桶中桶的总个数
size_t bucket_size(size_t n)const 返回n号桶中有效元素的总个数
size_t bucket(const key_type& k) 返回元素key所在的桶号
————————————————
状态压缩 一个二进制数 int 类型

int iscut(string s){
int n=s.length();
int ans=0;
for(int i=0;i<n;i++){
ans|=(1<<(s[i]-'a'));
}
return ans;
}

枚举一个二进制数的子集

int sub = k;
do {
sub = (sub -
1) & k;
}
while(sub != k);




set
有序列表的集合

begin()        返回set容器的第一个元素
end()      返回set容器的最后一个元素
clear()         删除set容器中的所有的元素
empty()    判断set容器是否为空
max_size()   返回set容器可能包含的元素最大个数
size()      返回当前set容器中的元素个数
rbegin     返回的值和end()相同
rend()     返回的值和rbegin()相同

count() 用来查找set中某个键值是否有出现过(0,1)。
equal_range() 
erase(iterator) ,删除定位器iterator指向的值
erase(first,second),删除定位器first和second之间的值
erase(key_value),删除键值key_value的值
find() ,返回给定值值得定位器,如果没找到则返回end()。
insert(key_value); 将key_value插入到set中 ,返回值是pair<set<int>::iterator,bool>,bool标志着插入是否成功,而iterator代表插入的位置,若key_value已经在set中,则iterator表示的key_value在set中的位置。
inset(first,second);将定位器first到second之间的元素插入到set中,返回值是void.
lower_bound(key_value) ,返回第一个大于等于key_value的定位器 end() 返回最后元素的下一个元素。
upper_bound(key_value),返回最后一个大于等于key_value的定位器

pair

pair<T1,T2>    p; 创建一个pair,包含两个已经被默认初始化的,类型分别为T1、T2的成员
pair<T1,T2>    p(v1,v2); 创建一个pair,first成员的类型为T1,值为v1,second成员的类型为T2,值为v2
pair<T1,T2>    p={v1,v2}; 创建一个pair,first成员的类型为T1,值为v1,second成员的类型为T2,值为v2
make_pair(v1,v2); 返回一个用v1和v2初始化的pair,pair的类型从v1和v2的类型推断出来
p.first; 返回p的first数据成员
p.second; 返回p的second数据成员

sscanf()
sprintf()