自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(50)
  • 收藏
  • 关注

原创 路径规划——曲线拟合详解(二):贝塞尔曲线、B样条曲线与QP优化( Fast-Planner算法核心部分)

曲线优化收官之战(看懂B样条+Fast-Planner)

2024-04-03 23:09:15 4321 4

原创 路径规划——曲线拟合详解(一):多项式轨迹与QP优化(minimum-snap算法核心部分)

无人机12个状态量,分别为x、y、z三个维度上的位置、速度、角度、角速度,其符号表示如下:微分平坦特性指的是可以通过对输入的高阶导数进行显示表示,以简化轨迹设计与跟踪控制的表达,可以通过选择合理的控制量对系统的控制空间进行有效降维。

2024-04-03 22:37:02 2349

原创 路径规划——搜索算法详解(七):D*lite算法详解与Matlab代码

搜索地图如上图所示,其中B1为起点,E3为目标点,在地图预处理时,根据设定的启发函数(如曼哈顿距离、欧氏距离、切比雪夫距离)等计算出每一个点的启发值h,规定直线距离、对角移动距离均为1。

2024-04-02 23:11:21 1860

原创 路径规划——搜索算法详解(六):LPA*算法详解与Matlab代码

一文看懂LPA*算法

2024-04-01 21:02:31 1973

原创 路径规划——搜索算法详解(五):Dynamic A Star(D*)算法详解与Matlab代码

昨天休息了一天,今天继续学习搜索算法!前几天已经分别介绍了Dijkstra算法、Floyd算法、RRT算法、A*算法,无独有偶,上述算法都只适用于静态环境下两点规划的场景,但是大部分场景是实时变化的,这对规划算法提出了更高的要求,Dynamic A star算法应运而生。Dynamic A star简称D*在中提出,笔者前期收集了很多D*算法的信息,刚开始看的时候也是云里雾里,看了很多遍才懂,其实基础原理并不复杂,但是描述起来比较绕,大家可以看多一遍,会有收获的。

2024-03-30 23:06:47 1688 2

原创 路径规划——搜索算法详解(四):A*算法详解与C++代码

从openlist 并弹出f值最小的路径点),此时因为只有S一个元素,故选择将S放入到closelist N中,并计算与S连接的路径点(只与a有连接)的代价函数,并将其加入到openlist 中,此时与S相连的路径点为a,f(a)=h(a)+g(a),此时g(a)为距离起点的距离:g(a) = 1,f(a) = 1+5 =6并将a加入到openlist 中,此时此时M={a(6)}、N={S}。一、A*算法流程(案例来自于。二、A*算法代码(C++)

2024-03-28 19:33:42 1259 2

原创 路径规划——搜索算法详解(三):RRT算法详解与MATLAB代码

本篇将介绍随机采样搜索算法(RRT),相比于上述两种方法,RRT为基于采样的搜索方法,该方法能够快速搜索路径,但是由于是随机搜索生成的路径,一般不是最优的,理论上具备概率完备性,即当搜索时间足够时可以得到最优路径,这是一种时间和路径最优上的权衡。在原有路径点中,找到距离采样点最近的点(由于起始路径只有起点,故起点即为最近点)。如图4所示,设定一个生长步长,以最近点与采样点的连线为采样角度,生长步长为距离,生成下一个路径点,此时判断该路径点与上一节点(起点)的连线是否与障碍物发生碰撞。

2024-03-27 12:59:02 2085 2

原创 路径规划——搜索算法详解(二):Floyd算法详解与MATLAB代码

初始化完成后我们进入第一个循环,此时i=1(按顺序排序,i=1234567分别为ABCDEFG为中介点的情况),此时我们需要以A为中间点,此时选取除A外的任一节点,并计算该节点与除开A点与该点以外的任一点的距离,如此时选取B点,计算B点到除A外的任一点的距离,如计算B到C的距离,经过A到达C的距离为AC距离加上BA距离,此时为inf+10>10不更新;更新完A点为中介点时B到达其他点的距离后,更新以A为中介点C到达其他任意点的距离,以此类推,计算D、E、F、G以A为中介点到达其他节点的距离。

2024-03-26 23:27:32 1281

原创 路径规划——搜索算法详解(一):Dijkstra算法详解与代码

一文带你搞定Dijkstra算法!(附带c++实现代码)

2024-03-22 16:26:39 1198 4

原创 FUEL算法解读(一)——框架解读,思维导图可以很清晰看懂算法启动框架,已更新完,图太大放不上来链接在文末

一图看懂FUEL算法节点框架!!!

2023-11-28 14:21:01 1005 3

原创 代码随想录算法训练营Day36 —— 738.单调递增的数字

题目要求小于等于N的最大单调递增的整数,那么拿一个两位的数字来举例。例如:98,一旦出现strNum[i - 1] > strNum[i]的情况(非单调递增),首先想让strNum[i - 1]--,然后strNum[i]给为9,这样这个整数就是89,即小于98的最大的单调递增整数。从后向前遍历,就可以重复利用上次比较得出的结果了,从后向前遍历332的数值变化为:332 -> 329 -> 299确定了遍历顺序之后,那么此时局部最优就可以推出全局,找不出反例,试试贪心。

2023-11-20 20:38:59 156

原创 代码随想录算法训练营Day36 —— 435. 无重叠区间、763.划分字母区间、56. 合并区间

即intervals[i]的左边界 <= intervals[i - 1]的右边界,则一定有重叠。(本题相邻区间也算重贴,所以是<=),本题技巧在于直接修改区间,不用删除再添加。所以一样的套路,先排序,让所有的相邻区间尽可能的重叠在一起,按左边界,或者右边界排序都可以,处理逻辑稍有不同。按照左边排序,按照452引爆气球的思路即可,统计重叠区间个数就是最小删除个数, 直接改点就好。这几道题都是判断区间重叠,区别就是判断区间重叠后的逻辑,本题是判断区间重贴后要进行区间合并。这么说有点抽象,看图:(

2023-11-20 19:56:17 122

原创 代码随想录算法训练营Day35 —— 860.柠檬水找零、406.根据身高重建队列、452.用最少数量的箭引爆气球

把气球排序之后,从前到后遍历气球,被射过的气球仅仅跳过就行了,没有必要让气球数组remove气球,只要记录一下箭的数量就可以了。可以看出首先第一组重叠气球,一定是需要一个箭,气球3,的左边界大于了 第一组重叠气球的最小右边界,所以再需要一支箭来射气球3了。按照身高排序之后,优先按身高高的people的k来插入,后序插入节点也不会影响前面已经插入的节点,最终按照k的规则完成了队列。如果按照k来从小到大排序,排完之后,会发现k的排列并不符合条件,身高也不符合条件,两个维度哪一个都没确定下来。

2023-11-20 16:36:30 64

原创 路径规划算法曲线篇(二)—— B样条曲线轨迹表示详解

B样条一篇看懂

2023-11-13 21:55:39 1984

原创 代码随想录算法训练营Day34 —— 1005.K次取反后最大化的数组和、134.加油站、135. 分发糖果

如果 ratings[i] > ratings[i + 1],此时candyVec[i](第i个小孩的糖果数量)就有两个选择了,一个是candyVec[i + 1] + 1(从右边这个加1得到的糖果数量),一个是candyVec[i](之前比较右孩子大于左孩子得到的糖果数量)。那么又要贪心了,局部最优:取candyVec[i + 1] + 1 和 candyVec[i] 最大的糖果数量,保证第i个小孩的糖果数量既大于左边的也大于右边的。全局最优:相邻的孩子中,评分高的孩子获得更多的糖果。

2023-11-13 17:16:36 38

原创 路规算法详细解读(一)—— FAST-Planner重要部分代码解读

由于最近的研究需要,需要对Fast-planner和Ego-planner的代码了解,所以写出这篇代码解读文章,本文持续更新。废话不多说了,上干货!本文基于以下大佬的代码解析基础上去阅读、理解、总结而成。三大主要部分。

2023-11-13 13:39:18 3147 6

原创 代码随想录算法训练营Day32 —— 122.买卖股票的最佳时机II、55.跳跃游戏、45.跳跃游戏II

局部最优推出全局最优,找不出反例,试试贪心!如图:i 每次移动只能在 cover 的范围内移动,每移动一个元素,cover 得到该元素数值(新的覆盖范围)的补充,让 i 继续移动下去。而 cover 每次只取 max(该元素数值补充后的范围, cover 本身范围)。如果 cover 大于等于了终点下标,直接 return true 就可以了。

2023-11-11 21:52:05 46

原创 代码随想录算法训练营Day31 —— 455.分发饼干、376.摆动序列、53.最大子序和

先排序,大尺寸的饼干既可以满足胃口大的孩子也可以满足胃口小的孩子,那么就应该优先满足胃口大的。。只用if没用for,逻辑比较简单同理可以遍历最小的胃口,用最小的饼干满足(先饼干后胃口),反过来不行,要知道是什么在遍历,什么满足后累加两个循环的顺序改变了,先遍历的饼干,在遍历的胃口,这是因为遍历顺序变了,我们是从小到大遍历。

2023-11-10 23:01:07 65

原创 代码随想录算法训练营基础(4) —— 贪心算法基础理论

本篇给出了什么是贪心以及大家关心的贪心算法固定套路。不好意思了,贪心没有套路,说白了就是常识性推导加上举反例。最后给出贪心的一般解题步骤,大家可以发现这个解题步骤也是比较抽象的,不像是二叉树,回溯算法,给出了那么具体的解题套路和模板。

2023-11-10 20:20:22 30

原创 代码随想录算法训练营Day29 —— 491.递增子序列、46.全排列、47.全排列 II

而本题求自增子序列,是不能对原数组进行排序的,排完序的数组都是自增子序列了本题给出的示例,还是一个有序数组 [4, 6, 7, 7],这更容易误导大家按照排序的思路去做了。为了有鲜明的对比,我用[4, 7, 6, 7]这个数组来举例,抽象为树形结构如图:即同层要去重,注意order定义的位置,每一层都有新的order记录值。

2023-11-08 22:44:27 39

原创 代码随想录算法训练营Day28 —— 93.复原IP地址、78.子集、90.子集II

与昨天做的分割回文数类似,但是这涉及到插入.号,剪枝比较暴力。在中我们就提到切割问题类似组合问题。startIndex一定是需要的,因为不能重复分割,记录下一层递归分割的起始位置。本题我们还需要一个变量pointNum,记录添加逗点的数量。终止条件和情况就不同了,本题明确要求只会分成4段,所以不能用切割线切到最后作为终止条件,而是分割的段数作为终止条件。pointNum表示逗点数量,pointNum为3说明字符串分成了4段了。然后验证一下第四段是否合法,如果合法就加入到结果集里在。

2023-11-08 19:46:11 89

原创 代码随想录算法训练营Day27 —— 39. 组合总和、40.组合总和II、131.分割回文串

本题与216的区别在于元素可以重复使用且没有数量要求。即深度是变化的。直接用回溯三部曲即可。

2023-11-06 20:32:19 52

原创 代码随想录算法训练营Day25 —— 216.组合总和III、17.电话号码的字母组合

和昨天大同小异,只需要添加记录总和的参数即可。注意减枝除了昨天对于i的限制外,还可以添加对于总和大于已求的条件。这个index是记录遍历第几个数字了,就是用来遍历digits的。中的startIndex了。注意这个index可不是。

2023-11-05 11:13:53 49

原创 代码随想录算法训练营Day24 —— 77.组合

。在这里要定义两个全局变量,一个用来存放符合条件单一结果,一个用来存放符合条件结果的集合。其实不定义这两个全局变量也是可以的,把这两个变量放进递归函数的参数里,但函数里参数太多影响可读性,所以我定义全局变量了。函数里一定有两个参数,既然是集合n里面取k个数,那么n和k是两个int型的参数。然后还需要一个参数,为int型变量startIndex,这个参数用来记录本层递归的中,集合从哪里开始遍历(集合就是[1,...,n] )。。

2023-11-04 21:34:44 62

原创 代码随想录算法训练营基础(3) —— 回溯法基础理论

再来看一下参数,因为回溯算法需要的参数可不像二叉树递归的时候那么容易一次性确定下来,所以一般是先写逻辑,然后需要什么参数,就填什么参数。什么时候达到了终止条件,树中就可以看出,一般来说搜到叶子节点了,也就找到了满足条件的一条答案,把这个答案存放起来,并结束本层递归。在上面我们提到了,回溯法一般是在集合中递归搜索,集合的大小构成了树的宽度,递归的深度构成的树的深度。,这样就把这棵树全遍历完了,一般来说,搜索叶子节点就是找的其中一个结果了。递归就要有终止条件,所以必然是一棵高度有限的树(N叉树)。

2023-11-04 20:22:43 29

原创 代码随想录算法训练营二叉树总结

涉及到二叉树的构造,无论普通二叉树还是二叉搜索树一定前序,都是先构造中节点。注意在普通二叉树的属性中,我用的是一般为后序,例如单纯求深度就用前序,求普通二叉树的属性,一般是后序,一般要通过递归函数的返回值做计算。求二叉搜索树的属性,一定是中序了,要不白瞎了有序性了。所以求普通二叉树的属性还是要具体问题具体分析。也用了前序,这是为了方便让父节点指向子节点。

2023-11-04 19:21:42 47

原创 代码随想录算法训练营Day23 —— 669. 修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树

这里我们为什么需要返回值呢?因为是要遍历整棵树,做修改,其实不需要返回值也可以,我们也可以完成修剪(其实就是从二叉树中移除节点)的操作。但是有返回值,更方便,可以通过递归函数的返回值来移除节点。这样的做法在二叉树:搜索树中的插入操作 (opens new window)和二叉树:搜索树中的删除操作 (opens new window)中大家已经了解过了。代码如下:确定终止条件修剪的操作并不是在终止条件上进行的,所以就是遇到空节点返回就可以了。确定单层递归的逻辑如果root(当前节点)的元素小

2023-11-03 22:39:25 39

原创 代码随想录算法训练营Day22 —— 235. 二叉搜索树的最近公共祖先、701.二叉搜索树中的插入操作、450.删除二叉搜索树中的节点

二叉搜索树是有序的,那得好好利用一下这个特点。因为是有序树,所有 如果 中间节点是 q 和 p 的公共祖先,那么 中节点的数组 一定是在 [p, q]区间的。即 中节点 > p && 中节点 < q 或者 中节点 > q && 中节点 < p。那么只要从上到下去遍历,遇到 cur节点是数值在[p, q]区间中则一定可以说明该节点cur就是p 和 q的公共祖先。当我们从上向下去递归遍历,第一次遇到 cur节点是数值在[q, p]区间中,那么cur就是 q和p的最近公共祖先。

2023-11-02 20:47:44 59

原创 代码随想录算法训练营Day21 —— 530.二叉搜索树的最小绝对差、501.二叉搜索树中的众数 、236. 二叉树的最近公共祖先

那么我们来说一说,如果 root == q,或者 root == p,说明找到 q p ,则将其返回,这个返回值,后面在中节点的处理过程中会用到,那么中节点的处理逻辑,下面讲解。但我们还要返回最近公共节点,可以利用上题目中返回值是TreeNode * ,那么如果遇到p或者q,就把q或者p返回,返回值不为空,就说明找到了q或者p。判断逻辑是 如果递归遍历遇到q,就将q返回,遇到p 就将p返回,那么如果 左右子树的返回值都不为空,说明此时的中节点,一定是q 和p 的最近祖先。思路和递归法一模一样。

2023-11-01 11:24:37 48

原创 代码随想录算法训练营Day20 —— 654.最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索、98验证二叉树

思路与DAY18中的一样,分割更加简单,直接操作传入数组就好。

2023-10-30 20:41:43 27

原创 代码随想录算法训练营Day18 —— 513.找二叉树左下角的值、112. 路径总和、113.路径总和II、106.从中序与后序遍历序列构造二叉树、105.从前序与中序遍历序列构造二叉树

如果使用递归法,如何判断是最后一行呢,其实就是深度最大的叶子节点一定是最后一行。可以使用前序遍历(当然中序,后序都可以,因为本题没有 中间节点的处理逻辑,只要左优先就行),保证优先左边搜索,然后记录深度最大的叶子节点,此时就是树的最后一行最左边的值。可以使用深度优先遍历的方式(本题前中后序都可以,无所谓,因为中节点也没有处理逻辑)来遍历二叉树。第四步:切割中序数组,切成中序左数组和中序右数组 (顺序别搞反了,一定是先切中序数组)tree1 的前序遍历是[1 2 3], 后序遍历是[3 2 1]。

2023-10-29 21:00:45 23

原创 代码随想录算法训练营Day17 —— 110.平衡二叉树、257. 二叉树的所有路径、404.左叶子之和

节点4 的path,在遍历到节点3,path+3,遍历节点3的递归结束之后,返回节点4(回溯的过程),path并不会把3加上。老规矩迭代三部曲,主要是迭代处理逻辑,当任一子节点不为平衡二叉树时返回-1,当子节点返回值为 -1时,母节点直接返回-1。递归完,要做回溯,因为path 不能一直加入节点,它还要删节点,然后才能加入新的节点。如果该节点的左节点不为空,该节点的左节点的左节点为空,该节点的左节点的右节点为空,则找到了一个左叶子。这样的函数参数呢,然后也可能在递归函数中展现回溯的过程,但关键在于,

2023-10-27 12:39:24 20

原创 代码随想录算法训练营Day16 —— 104.二叉树的最大深度、559.n叉树的最大深度、111.二叉树的最小深度、222.完全二叉树的节点个数

利用完全二叉树的性质降低计算法复杂度,在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。对于情况二,分别递归左孩子,和右孩子,递归到某一深度一定会有左孩子或者右孩子为满二叉树,然后依然可以按照情况1来计算。前序与中序遍历:真正意义上的最大深度搜索,遍历每一个节点,每个节点都是母节点+1的深度,不断更新最大深度即可。那么使用后序遍历,其实求的是根节点到叶子节点的最小距离,就是求高度的过程,不过这个最小距离 也同样是最小深度。

2023-10-26 13:02:05 33

原创 代码随想录算法训练营Day15 —— 102.二叉树的层序遍历(迭代法写法)、226.翻转二叉树、101.对称二叉树

层序遍历一个二叉树。就是从左到右一层一层的去遍历二叉树。需要借用一个辅助数据结构即队列来实现,

2023-10-25 22:44:35 37

原创 代码随想录算法训练营Day14 —— 二叉树基础、递归遍历、迭代遍历、统一迭代

int val;

2023-10-24 13:49:24 28

原创 代码随想录算法训练营Day13 —— 239.滑动窗口最大值、347.前 K 个高频元素

窗口移动的时候,调用que.pop(滑动窗口中移除元素的数值),que.push(滑动窗口添加元素的数值),然后que.front()就返回我们要的最大值。队列里的元素一定是要排序的,而且要最大值放在出队口,要不然怎么知道最大值呢。但如果把窗口里的元素都放进队列里,窗口移动的时候,队列需要弹出元素。那么问题来了,已经排序之后的队列 怎么能把窗口要移除的元素(这个元素可不一定是最大值)弹出呢。

2023-10-23 12:58:07 69

原创 代码随想录算法训练营Day11 —— 20.有效的括号、1047. 删除字符串中的所有相邻重复项、150. 逆波兰表达式求值

在项目比较大的时候,由于参数多,全局变量等等,使用递归很容易判断不充分return的条件,非常容易无限递归(或者递归层级过深),第三种情况:遍历字符串匹配的过程中,栈已经为空了,没有匹配的字符了,说明右括号没有找到对应的左括号return false。从栈中弹出剩余元素,此时是字符串ac,因为从栈里弹出的元素是倒序的,所以再对字符串进行反转一下,就得到了最终的结果。,然后递归返回的时候,从栈顶弹出上一次递归的各项参数,所以这就是递归为什么可以返回上一层位置的原因。150. 逆波兰表达式求值。

2023-10-22 20:56:48 42

原创 代码随想录算法训练营Day10 —— 栈与队列基础、232.用栈实现队列、225.用队列实现栈

队列为先进先出,栈为先进后出。 栈与队列也是数据结构的一种,是STL(C++标准库)里面的两个数据结构。C++标准库是有多个版本的,要知道我们使用的STL是哪个版本,才能知道对应的栈和队列的实现原理。三个普遍的STL版本如下所示:HP STL 其他版本的C++ STL,一般是以HP STL为蓝本实现出来的,HP STL是C++ STL的第一个实现版本,而且开放源代码。P.J.Plauger STL 由P.J.Plauger参照HP STL实现出来的,被Visual C++编译器所采用,不是开源的。SGI S

2023-10-20 17:23:14 79

原创 代码随想录算法训练营Day8 —— 344.反转字符串、541.反转字符串II、剑指Offer 05.替换空格、151.翻转字符串里的单词、剑指Offer58-II.左旋转字符串

常用的头尾双指针,很简单就没啥好说的了。

2023-10-19 20:37:53 26

原创 代码随想录算法训练营Day7 —— 454.四数相加II、383.赎金信、 15.三数之和、18.四数之和

首先,如果采用暴力搜索复杂度为O(N^4),无需考虑元素相同的问题,参考两数相加的方法,本题也采用哈希法,选用unordered_map,key放a和b两数之和,value 放a和b两数之和出现的次数。

2023-10-17 23:04:22 82

路径规划-深蓝学院数值优化学习笔记(含PPT)

路径规划-深蓝学院数值优化学习笔记(含PPT)

2024-04-04

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除