
C++算法
文章平均质量分 75
介绍一些算法思路,提供题解
三眼五显仙人~
三眼五显仙人,魈,听召,前来守护。
展开
-
【递归深搜之记忆化搜索算法】
但是我们点击运行发现程序报错了,超时了,因为我们题目存在大量的重复的递归,所以我们这个题目需要采用记忆化手搜索去解决。这个题目我们首先想到就是递归深搜右和下两个方向的路径,直到达到终点,此时我们统计次数,但是别忘记了要恢复现场哟。我们看到这个题目,依然是先画出我们的决策树,先来看看决策树什么样子。但是此时会超时,我们依然要使用记忆化搜索去解决。同时我们这里还可以直接修改成动态规划的形式。此时我们也可以改成动态规划的代码。原创 2024-08-29 22:25:33 · 664 阅读 · 1 评论 -
【递归回溯之floodfill算法专题练习】
正难则反,我们可以四周开始向里面遍历,但凡能深搜到的,都是不能修改的,此时我们将遍历到的标记一下,其余的全部修改成x即可。原创 2024-08-28 20:40:40 · 462 阅读 · 0 评论 -
【回溯算法经典题目练习】
我们可以看到上面的决策树之后,我们会发现当我们找到word里面的一个单词在矩阵里面的时候,我们会遍历上下左右四个方向的字母,此时我们就可以使用下面的策略来帮助我们访问这四个位置。这个题目很类似我们之前做过的子集问题,对于子集我们是当前值选或者是不选,而对于这道题目,是对于+或者-我们选或者不选,我们依然是先画出决策树。有了上一个题目的判断,我们这个题目就比较简单了,先画出决策树,我们没遇到一个格子,先判断能不能填,能填就填,不能填就换下一个数。此时我们可以按照每个位置选不同的值来画出我们的决策树。原创 2024-08-27 19:47:04 · 479 阅读 · 0 评论 -
《剑指offer》题目 C++详细题解
如果是,则将添加到结果列表中,并返回。解题思路:这道题很有意思,核心理解是我们对于排序算法的理解,通常我们所理解的排序是比较大小的,如:升序排序的序列意思是:序列中任何一个数字,都比前面的小,比后面的大,我们把说法换一下,对于本题,我们要的有效序列是:序列中任何一个元素y,和它前的任何一个元素x进行有序组合形成xy,比和他后面的任何一个元素z进行有效序列组合yz,满足条件xy < yz(采用字典序列排序)如{32,31},有效组合是3132,所以我们拍完序列之后序列变成{31, 32}.原创 2024-08-20 19:32:04 · 1265 阅读 · 0 评论 -
《剑指offer》题目 C++详细题解
思路一:使用一个循环,因为我们知道整型变量只有32位,所以循环结束的条件就是到32,从最低位开始,逐位检查数字 n 的二进制表示,利用位运算中的与运算,将当前位移到最低位,然后与 1 进行按位与运算,判断结果是否为 1,如果当前位为 1,则计数器 count 加 1,循环结束后,计数器 count 中保存的就是数字 n 的二进制表示中 1 的个数。但是上面的算法的时间复杂度是O(N)的,有没有更简单更便捷的算法呢?思路二:使用 while 循环,只要 n 不为 0,就继续循环。原创 2024-08-13 21:44:50 · 940 阅读 · 0 评论 -
《剑指offer》题目 C++详细题解
这个过程,会让[left,right]区间缩小,这个过程中,left永远在原数组前半部分,right永远在原数组的后半部分,而范围会一直缩小,当left和right相邻时,left指向的位置,就是最小元素的位置,但是,因为题目说的是非递减,也就意味着数据允许重复,因为有重复值,就可能会有a[left] == a[mid] ==a[right]的情况,此时我们就不能用单纯的二分算法模板来写这个题目,我们此时需要单独处理一下有重复值的情况,我们上面是采用的右端点进行判断,同时我们也可以使用左端点进行判断。原创 2024-08-05 14:46:49 · 885 阅读 · 0 评论 -
【回溯算法经典题目解析】
回溯算法是⼀种⾮常重要的算法,可以解决许多组合问题、排列问题和搜索问题等。回溯算法的核心思想是搜索状态树,通过遍历状态树来实现对所有可能解的搜索。回溯算法的模板非常简单,但是实现起来需要注意⼀些细节,比如如何做出选择、如何撤销选择等。原创 2024-07-02 21:42:07 · 1140 阅读 · 2 评论 -
贪心算法题目总结
首先我们看到这个题目,就和我们之前的最长递增子序列是一样的,我们需要对左端点进行排序,然后看是否满足俄罗斯套娃的条件,既然是找最长的套娃个数,此时我们可以使用动态规划来解决这个问题,我们可以假设dp[i]位置表示i位置之前的此时最长的套娃个数,当我们到i的位置的时候,我们需要看看0到i-1位置的最长的套娃个数,如果有一个条件满足俄罗斯套娃的条件,那么最长的套娃个数就可以+1,此时就可以使用动态规划来解决这个问题。我们可以先把所有的数累加在⼀起,然后根据累加和的结果,贪心的删除⼀些数。原创 2024-06-26 20:06:48 · 383 阅读 · 1 评论 -
贪心算法总结
我们会发现这个题目依然是一个区间问题,所以做法依然是先对左端点排序,然后再想出一个贪心策略即可,我们只需要最少的弓箭数,那么一支箭应该引爆更多的气球,将两两互相重叠的所有区间都拿出来引爆。这种会超时,我们想想一下贪心的策略。原创 2024-06-20 21:14:48 · 488 阅读 · 1 评论 -
【贪心算法题目练习】
但是此时会超出时间限制,复杂度太高,我们可以优化一下哈,我们发现,当从 i 位置出发,走了 step 步之后,如果失败了。那么 [i, i + step] 这个区间内任意⼀个位置作为起点,都不可能环绕⼀圈。这个题目和上面的题目思路基本上差不多,但是上一个题目的明显说了一定会到达最后一个下标位置,而我们这道题目是判断能否到达最后一个下标位置,基于上一个题目我们仅需修改⼀下返回值即可,直接上代码啦!因此我们枚举的下⼀个起点,应该是 i + step + 1。原创 2024-05-31 10:19:51 · 1058 阅读 · 1 评论 -
贪心算法专题练习
这个题目的贪心就体现在最小的负数取反之后对整个数组和的贡献是最大的,直接上思路:这个题目比较简单,按照贪心的思想我们只需要按照身高的最大值排序即可,但是仍有一些细节问题,我们不能直接按照i位置对应的heights来排序,因为排序过程是会移动元素的,但是names内的元素是不会移动的。由题意可知,names 数组和heights数组的下标是一一对应的, 因此我们可以重新创建出来一个下标数组,将这个下标数组按照heights[i]的大小排序。原创 2024-05-30 11:41:03 · 808 阅读 · 0 评论 -
简单多状态 dp 问题
【代码】简单多状态 dp 问题。原创 2024-05-26 21:32:12 · 411 阅读 · 2 评论 -
贪心题目总结
首先我们看到这道题目,第一想到的肯定是暴力枚举,我们可以依次枚举两个位置,然后进行相减,最后保存相减出来的最大值即可,但是这样的复杂度就是O(N2)的,此时我们就可以进行优化,我们在枚举卖出价格时候,并不用将前面买入的股票的价格依次枚举,我们只需要找到其中的最小值即可,这一个点就体现出来贪心的策略,由于只能交易⼀次,所以对于某⼀个位置 i ,要想获得最大利润,仅需知道前⾯所有元素的最小值。由于可以进行⽆限次交易,所以只要是⼀个「上升区域」,上升区间一定是稳赚的,我们就把利润拿到手就好了,这就是贪心策略。原创 2024-05-26 21:27:17 · 559 阅读 · 0 评论 -
【贪心算法题目】
因此,我们可以创建一个数组,统计长度为 x 的递增子序列中,最后一个元素是谁。此时我们来算一下时间复杂度,首先我们要遍历整个数组,其次我们还要遍历长度为x的序列,那么此时的复杂度是O(N2),统计的过程中发现,数组中的数呈现「递增」趋势,因此可以使用「二分」来查找插入位置。这个题目依然是采用贪心来解决,将所有的数字当成字符串处理,那么两个数字之间的拼接操作以及比较操作就会很方便,此时我们只需要找出每次两个值组合的最大的排序方式重新定义⼀个新的排序规则,然后排序即可即可解决问题。原创 2024-05-23 22:01:33 · 716 阅读 · 1 评论 -
【C++算法】BFS解决拓扑排序问题相关经典算法题
有向无环图是一种特殊的图数据结构。在这样的图中,节点之间通过有向边连接,表示从一个节点到另一个节点的单向关系,并且不存在任何形式的环路,即没有路径可以让你从一个节点出发,沿着一系列有向边最终又回到该节点。拓扑排序是对一个有向无环图的顶点进行排序的一种方法,找到做事情的先后顺序,拓扑排序的结果可能不唯一。AOV网就是在有向无环图中每一个顶点代表一个活动,而有向边则表示活动之间的优先关系的图结构。这个题目给的实例比较简单,我们重新来给一个案例来快速了解这个题目。1.初始化:把所有入度为0的点加入到队列。原创 2024-05-22 21:43:21 · 1081 阅读 · 0 评论 -
【C++算法】BFS解决多源最短路问题相关经典算法题
这道题目如果我们按照每次遍历数组每次遇到1就去bfs,肯定是会超时的,但是根据这个写法也有不超时的做法,我们遍历的时候,遇到1就去bfs,并将途中遇到1的位置标记一下,下一轮遇到1的时候,先dfs一下,如果这次dfs宽搜的时候遇到1,发现这个位置已经标记过,此时就不要bfs了,直接就是上次的结果,但是这样写需要两次dfs,并且dsf的代码还不一样,也比较麻烦,那我们来一个新思路:正难则反,我们可以从边上的 1 开始搜索,把与边上 1 相连的联通区域全部标记⼀下;但是如何将这个源点当作一个超级源点呢?原创 2024-05-20 21:56:30 · 677 阅读 · 1 评论 -
【C++算法】BFS解决单源最短路问题相关经典算法题
我们利层序遍历来解决最短路径问题,是最经典的做法。我们可以从起点开始层序遍历, 并组在遍历的过程中记录当前遍历的层数。首先我们看到这个题目,真的是难从下手,既然我们这章是最短路径,我们可以尝试从这方面来考虑考虑,我们可以考虑尝试来转化一下哈。首先我们可以将这道题目简化一下,可以往我们这一章的主题上面来想想。原创 2024-05-19 10:54:30 · 691 阅读 · 1 评论 -
【C++算法】BFS解决FloodFill算法相关经典算法题
首先我们来看看这道题目,我们可以肯定的是这个可以利用上面的图像渲染来做这道题目,但是呢?我们这道题目有点现在,在边界的情况下我们是不能修改的,但是也能做,我们第一遍bfs的时候,不修改里面的值,只遍历到那些边界的情况记录下来,第二次bfs的时候如果遇到上次边界的情况,我们就不修改,如果没有我们就修改,但是太麻烦了,我们有没有更简单的做法呢?原创 2024-05-16 19:45:44 · 312 阅读 · 1 评论 -
【C++算法】堆相关经典算法题
如果还有剩余,就将剩余的石头继续放在原始的石堆里面重复上面的操作,直到石堆里面只剩下一个元素,或者没有元素(因为所有的石头可能全部抵消了),那么主要的问题就是解决:如何顺利的拿出最大的石头以及次大的石头;我们一看到这个就会说,这行呀!我相信找第K大元素,就能想到TopK问题,兄弟们应该能立马想到「堆」, 这应该是刻在骨子里的记忆,只不过我们要知道找第K大元素我们需要建立小堆,我们要想想,如果我们弄一个大堆,如果第一个元素就是数组中最大的元素,那么此时其他元素如何入堆,哪还找什么第k的元素呢?原创 2024-05-15 17:31:36 · 389 阅读 · 0 评论 -
【C++算法】队列相关经典算法题
这道题相较于上面三道题就有点难度了,这个题目男难就难在处理空节点,既然统计每一层的最大宽度,我们优先想到的就是利用层序遍历,把当前层的结点全部存在队列⾥面,利用队列的常度来计算每一层的宽度,统计出最大的宽度。其实这道题我们也可以用数组来实现,但是这时候有人说了此时我们会经常进行删除节点,而删除节点都是头删,而数组的头删效率较低,你咋还使用我们的数组呢?内存限制,那么此时我们的编号是2的1500次方,那么肯定会越界,此时无论什么数据类型我们都存不下,但是这个题最后我们是会进行减法的,亿个空节点,会超过最。原创 2024-05-11 21:50:14 · 1190 阅读 · 1 评论 -
【C++算法】栈相关经典算法题
这个题目很有乐趣,解决这道题目我们对这个字符串要纵向看它,此时如果相邻的字符相同,比如我们上面的[b]和[b],我们就可以把它消灭,然后这两个被消除的字符的上面字符[a]往下掉落,然后这个字符又有相邻相同的字符[a],我们又可以它消灭,很像我们玩过的开心消消乐游戏,只不过我们这里的是两个字符相同就满足消消乐,回归本题,既然要纵向看它,此时我们的数据结构就只有栈符合这个条件,当前元素是否被消除,需要知道上⼀个元素的信息,可以⽤栈来保存信息。自然是遇到一个元素等于当前的出栈序列的元素,那我们就让它出栈。原创 2024-04-27 21:56:42 · 904 阅读 · 0 评论 -
【专题二 --- 二叉树中的深搜】
另一种写法:由于我们在叶子节点的时候已经计算出了这条路径的和,于是我们可以设置一个全局变量,当为叶子节点的时候,我们就可以直接加到全局变量上去。原创 2024-04-11 21:16:22 · 441 阅读 · 0 评论 -
【专题九 --- 链表】
【代码】【专题九 --- 链表】原创 2024-04-09 20:44:45 · 320 阅读 · 0 评论