一、滑动窗口
二、双指针
双指针问题:
原理:双指针,指的是在遍历对象的过程中,不是普通的使用单个指针进行访问,而是使用两个相同方向(快慢指针)或者相反方向(对撞指针)的指针进行扫描,从而达到相应的目的。
例:424. 替换后的最长重复字符--------首先明确的是需要确定一段范围内(ptr_s,ptr_e)最多的相同的字母数tmp_n,可以直接冲map里面取,当tmp_n+可变数k>ptr_e-ptr_s,那么就增加ptr_e,且map[ptr_e]++,更新最大值,如果当前map[ptr_e]>最大值,就更新,否则就增加ptr_s,map[ptr_s]–
三、快慢指针/ 链表题目
四、原地链表翻转
五、区间合并
六、无序限定范围的数组元素查找O(N)
七、BFS
八、树的DFS
九、DFS/递归/回溯法
1、DFS(深度优先搜索):
原理:DFS其实是基于递归算法的,也就是对应N的结果依赖N-1的结果,但是除此之外还需要进行回溯,涉及到堆的设计:
例如:778. 水位上升的泳池中游泳----其中从(i,j)走到(n-1,n-1)点它的结果是依赖于(i-1,j)、(i+1,j)、(i,j-1)、(i,j+1)到(n-1,n-1)的结果,也就是从上述4个中找一个最小的,但是比如(i-1,j)点依赖的点也有之前的(i,j)点,这就形成了相互依赖,那将计算n的结果依赖n-1的结果,但是要把之前走过的路径带给n-1,那就使得每次都要将之前走过的路径带给n-1,这使得内存消耗比较大,这里通过深度优先算法,算出一条路径到(n-1,n-1),设计一个队列和一个记录当前点到(0,0)点的最小值,当计算到第二条路径时,一旦中间有一个点之前的路径已经记录了当前点到(0,0)点的最小值(暂时),一旦计算这次当前点到(0,0)的值比之前的值大,就直接放弃,因为之前已经有当前点到(0,0)点比这一次小了。
2、递归
原理:就是简单的f(n)=f(n-1)+k
例如:390. 消除游戏--------取n个数进行消除,看剩下的那个是多少,其实计算n时,就是计算n/2的值,将它的结果转换为n个数中的第多少个,这里还要考虑下正向消除和反向消除
十、双堆模式
十一、2分变种
十二、前K大的数模式HEAP
十三、K路归并
十四、DP 动态规划
1、DP算法思想
(1)将待求解的问题分解称若干个子问题,并存储子问题的解而避免计算重复的子问题,并由子问题的解得到原问题的解。
(2)动态规划算法通常用于求解具有某种最有性质的问题。
(3)动态规划算法的基本要素:最优子结构性质和重叠子问题。
最优子结构性质:问题的最优解包含着它的子问题的最优解。即不管前面的策略如何,此后的决策必须是基于当前状态(由上一次的决策产生)的最优决策。
重叠子问题:在用递归算法自顶向下解问题时,每次产生的子问题并不总是新问题,有些问题被反复计算多次。对每个子问题只解一次,然后将其解保存起来,以后再遇到同样的问题时就可以直接引用,不必重新求解。
十五、排序算法
十六、树和链表结合
十七、树的重新构建
十八、位运算
十九、字符串
二十、stack
二十一、math
二十二、array
二十三、二叉搜索树
二十四、并查集:
原理:准备一个数组,将每个元素记录其中,且对应元素的值是该元素的根(初始的时候都是该元素自身),也就是如果两个元素联通的话,说明这两个元素的根的值是一样的
二十五、贪心算法:
贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。
贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。
1、Dijkstra算法:
前提:
首先,Dijkstra处理的是带正权值的有权图,那么,就需要一个二维数组(如果空间大用list数组)存储各个点到达(边)的权值大小。(邻接矩阵或者邻接表存储)
其次,还需要一个boolean数组判断那些点已经确定最短长度,那些点没有确定。int数组记录距离(在算法执行过程可能被多次更新)。
需要优先队列加入已经确定点的周围点。每次抛出确定最短路径的那个并且确定最短,直到所有点路径确定最短为止。
步骤:
a.初始时,S只包含源点,即S={v},v的距离为0。U包含除v外的其他顶点,即:U={其余顶点},若v与U中顶点u有边,则<u,v>正常有权值,若u不是v的出边邻接点,则<u,v>权值为∞。
b.从U中选取一个距离v最小的顶点k,把k,加入S中(该选定的距离就是v到k的最短路径长度)。
c.以k为新考虑的中间点,修改U中各顶点的距离;若从源点v到顶点u的距离(经过顶点k)比原来距离(不经过顶点k)短,则修改顶点u的距离值,修改后的距离值的顶点k的距离加上边上的权。
d.重复步骤b和c直到所有顶点都包含在S中