Leetcode算法题总结

本文详细解读了滑动窗口、双指针算法在解决字符串和数组问题中的应用,深入探讨了DFS、递归、动态规划等核心概念,涉及Dijkstra算法和贪心策略,同时涵盖了排序、树结构、数据结构、云计算与AI算法等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、滑动窗口

二、双指针

双指针问题:
原理:双指针,指的是在遍历对象的过程中,不是普通的使用单个指针进行访问,而是使用两个相同方向(快慢指针)或者相反方向(对撞指针)的指针进行扫描,从而达到相应的目的。
例: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中

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值