引言
leecode刷起来,每天5道题,太笨了,只能相信勤能补拙,在这儿立志。
学会总结类型、思路和相似之处,思路怎么突破的
1基础算法
1.1 双指针类型
这类属于比较基础的问题,包括窗口类型、快慢类型等
框架:
通过多层for循环改进算法
for (i=0;i<n;i++)
while(j<n)
if (满足条件)
j++
update j
else
break;
update i
时间复杂度最优O(logn)、次优O(n),O(nlogn),O(n^2)
- 双指针:最小串覆盖、最长无重复子串
- 用到了堆的思想:矩阵从小到大的第k数、N维数组K大数—先维护一个堆数组;Heap维护候选集合;排序
- 用到栈的思想,用来维护信息或者翻转信息,单调递增和单调递减,最大矩形,
1.2 并查集
可以用来判断在不在同一个集合中,集合合并
// find father
int find(int x)
{
if (father[x]==x)
{
return x;
}
return father[x]=find(father[x])// 非路径压缩 find(father(x))
}
// union sets
void union(int x,int y)
{
int root_x=find(x);
int root_y=find(y);
if (root_x!=root_y)
{
father[root_x]=root_y;
}
}
时间复杂度压缩路径O(1),不压缩路径O(n)
1.3 字典树
index
1.4 图
判断图中有没有环:拓扑排序、DFS\BFS、并查集
- 拓扑排序,a)判断入度的大小对于无向图,入度<=1,对于有向图,入度为0; b)将满足条件的节点入队列;c)出队列,对于队列的临街节点度减1 加入队列
- 并查集,find union ,对于无向图 如果节点的father相等,则有环;对于有向图,u->v, 如果u的父节点是v则有环
- DFS, 如果访问的节点已经访问过了,有环(黑,白,灰染色法)
1.4 二分法
1二分法的深入理解
1.1 二维二分
1.2 按照值阈进行二分
2 扫描线
3 双端队列
解题方法
- 找到可行解范围
- 猜答案
- 检验条件
- 调整搜索范围
int start=1,end=max;
while(start+1<end)
{
int mid=start+(end-start)//2
if(check(mid))
{
start=mid;
}
else{
end=mid;
}
1.2 动态规划
根据最终结果,可以分为多少步、有没有、路径等
可以分为坐标型、序列型、划分型、博弈型、背包型、区间型、双序列型等
一般通过最后或者第一步的关系找规律,先确定状态、然后是状态转移方程、最优解。
2 数据结构
队列、树、堆、数据组、栈、链表、图、散列表
| 数据结构类型 | C++ |python|
|:--------😐: -------------😐:-------------------😐
| centered 文本居中 | right-aligned 文本居右 |
数据结构类型 | C++ | python |
---|---|---|
数组 | int array[] | array=[] |
栈\队列 | #include ;q.empty();q.size();q.pop();q.push();q.back();q.push() | from Queue import queue, LifoQueue,PriorityQueue |
树 | 数的遍历,前序:先访问,然后遍历左右子树;中序:第一次进过时不访问,等左子树访问了就访问根节点然后右子树;后序:第一次进过和第二次进过的时候都不访问,等孩子访问完了再访问根节点 | |
图 | ||
堆 | #include;priority_queue<Node,vector,less > pqLess;priority_queue<Node,vector,greater > pqGreater; | from heapq import *; heappush(heap,5) |
散列表 | #include | a={} |
链表 |
- 数组
字典
、