![](https://img-blog.csdnimg.cn/20190918140213434.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
算法套路
文章平均质量分 96
算法套路
Pistachiout
记录学习
展开
-
算法套路二十——单调栈
单调栈是一种特殊的数据结构,用于解决与元素的相对大小有关的问题。它是一个栈,但其中的元素以的顺序排列,用于处理与有关的问题。原创 2023-08-10 15:34:29 · 164 阅读 · 0 评论 -
算法套路十九——树形DP
树形 DP,即在树上进行的 DP。由于树固有的递归性质,这里的DP是指是一种通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法,故虽然带有DP,但一般都是通过来进行。原创 2023-06-04 19:48:55 · 1866 阅读 · 0 评论 -
算法套路十八——区间 DP
区间DP:需要确定给定区间内所有可能状态的问题,并从较小区间向较大区间进行转移。原创 2023-05-24 20:15:21 · 1255 阅读 · 1 评论 -
算法套路十七——买卖股票问题:状态机 DP
买卖股票问题是一种典型的状态机 DP问题,设"未持有股票"和"持有股票"两个状态,每个节点表示某一状态下的最大收益,相邻节点之间的边表示在当前状态下进行一次交易得到的收益。原创 2023-05-17 20:32:47 · 1084 阅读 · 0 评论 -
算法套路十六——DP求解最长递增子序列LIS
给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。原创 2023-05-15 20:58:15 · 1424 阅读 · 0 评论 -
算法套路十五——动态规划求解最长公共子序列LCS
给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0。一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。例如,“ace” 是 “abcde” 的子序列,但 “aec” 不是 “abcde” 的子序列。两个字符串的 公共子序列 是这两个字符串所共同拥有的子序列。原创 2023-05-11 19:21:25 · 2303 阅读 · 0 评论 -
算法套路十四——动态规划之背包问题:01背包、完全背包及各种变形
0-1背包:有n个物品,第i个物品的体积为w[i],价值为v[i],每个物品至多选一个, 求体积和不超过capacity时的最大价值和,其中i从0开始。原创 2023-05-01 20:16:33 · 2504 阅读 · 0 评论 -
算法套路十三——动态规划DP入门
动态规划和递归都是通过将大问题分解为较小的子问题来解决问题。它们都可以用来解决具有重叠子问题和最优子结构特性的问题。在很多情况下,。原创 2023-04-27 18:17:02 · 1271 阅读 · 0 评论 -
算法套路十二——回溯法之排列型回溯
相比子集型回溯,排序型回溯的区别就是在选择相同子集时不会判断为重复,而是不同的排列,因此我们从答案的角度出发,考虑每次选哪一个数,且由于选择顺序不同排列也不同,故在递归时不用考虑要使后选的元素大于当前选的元素,那我们如何判断是否选择,可以使用on_path数组,来记录数组第i个元素是否被选择,且要在递归完成后回溯。你可以 按任意顺序 返回答案。n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。原创 2023-04-22 20:00:21 · 717 阅读 · 0 评论 -
算法套路十一 ——回溯法之组合型回溯
剪枝:对于本题,为考虑方便,我们可以从n开始进行选择,设path长为m,那么还需要选d=k - m个数设当前需要从[1,i]这i个数中选数,如果i原创 2023-04-21 22:51:46 · 839 阅读 · 0 评论 -
算法套路十——回溯法之子集型回溯
采用回溯法,用path记录当前数字选择的情况,ans记录答案。当前问题:数组前i-1个元素是否选择固定,枚举数组从第i个元素开始的所有元素是否选择当前操作:i是否为n,若是则将当前path加入ans中。若不是则需要枚举子集选择第i位元素或不选第i位元素,若不选第i位元素,则直接递归子问题;若选择第i位元素,则需要先将当前元素加入path中,并递归子问题,在递归完成后,进行回溯,将第i位元素从path中删除子问题:数组前i-1个元素是否选择固定,枚举数组从第i+1个元素开始的所有元素是否选择。原创 2023-04-18 19:10:58 · 932 阅读 · 0 评论 -
算法套路九——二叉树广度优先遍历(层序遍历)
二叉树广度优先层序遍历,采用双数组或队列原创 2023-04-13 20:40:16 · 1299 阅读 · 0 评论 -
算法套路八——二叉树深度优先遍历(前、中、后序遍历)
前序遍历在某些数据下不需要递归到边界(base case)就能返回,而另外两种需要递归到至少一个边界,从这个角度上来说它是最快的。中序遍历很好地利用到了二叉搜索树的性质,使用到的变量最少。后序遍历的思想是最通用的,即自底向上计算子问题的过程。想要学好动态规划的话,请务必掌握这个思想。且由以上示例代码都可以看出,在代码书写时要定义内部匿名函数dfs,不然可能会由于LeetCode判断问题影响结果。原创 2023-04-12 16:23:11 · 1555 阅读 · 0 评论 -
算法套路七——二叉树递归
该题与上题一样,递归思想基本一样,也是使用全局变量进行解决,不过该题在代码书写上值得注意,在go语言中只有值传递,当slice做为参数传递给函数的时候,新建了切片s,只是原始切片slice和参数s切片的底层数组是一样的,与Java不同,在Java中需要使用Lsit进行修改,且在函数结束前需要删除List的最后一个元素。给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。原创 2023-04-06 19:55:58 · 1386 阅读 · 0 评论 -
算法套路六——删除链表元素
给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点。本题与本专栏算法套路四中的算法示例二:LeetCode92. 反转链表 II一样,可能删除头结点也可能不删除头结点,遇到这种情况需要定义dummy哨兵节点,如不理解可前往[算法套路四]中的算法示例二阅读直接定义cur = dummy,对cur进行遍历,若cur.next.val等于val则使cur.next = cur.next.next。原创 2023-03-28 20:03:49 · 622 阅读 · 0 评论 -
算法套路五——快慢指针
给你单链表的头结点 head ,请你找出并返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。可以设置快慢指针,快指针每次移动两步,慢指针每次移动一步,进过数学推导,可以得出无论数组长度时奇数还是偶数,都可以保证快指针移动到末尾时慢指针移动到数组中间结点,不过要注意的是考虑到由于fast每次走两步,所以循环判断条件为。原创 2023-03-30 15:02:25 · 373 阅读 · 1 评论 -
算法套路四——反转链表
`初始化pre为空,cur为头指针`pre指针:记录当前结点的前一个结点cur指针:记录当前结点,cur的next指针指向prenxt指针:记录当前结点的后一个结点,记录cur的next,防止断链循环中左边按照`ncpc`的顺序反转,右边按照cpcn的顺序,且左右两边第一个c都为cur.next原创 2023-03-22 19:51:25 · 527 阅读 · 0 评论 -
算法套路三:二分查找——红蓝染色法
left指针掌管左边蓝色区域,蓝色表示 truej即所求值及其右侧,right指针掌管右边红色区域,红色表示false即所求值左侧,两者互不冲突,通过不断向目标区域靠近,扩大两个指针的掌管区域,直到两者掌管的区域接壤使用闭区间时,L-1必定是红色即false,R+1必定是蓝色即true,这就是循环不变量关键不在于区间里的元素具有什么性质,而是区间外面的元素具有什么性质,即将区间外染成红色与蓝色。根据以上两点,在做题时关键即确定二分条件函数isBlue()原创 2023-03-14 20:22:55 · 1462 阅读 · 1 评论 -
算法套路二:相向双指针
相向双指针故套路如下: 比较 s = numbers[left] + numbers[right]与**固定值target**(关键为找到该固定值) 如果s > target,right-- 如果s < target,left++原创 2023-03-06 19:28:28 · 568 阅读 · 0 评论 -
算法套路一:同向双指针
数组要具有单调性,即right或left右移只会导致数组单调增加或减少若满足单调,则首先对right进行 for range枚举,并循环判断是否移动left,直到比较子数组与target满足条件,并取max或mintarget可以变化,比如子数组和、积、长度、元素出现次数等等求最小值时,右指针移动会导致满足条件,故要通过左指针移动找出当前满足条件的右指针的最值,在左指针循环内先求最值min,不满足条件时退出当前左指针循环,继续遍历右指针。原创 2023-02-22 20:25:07 · 874 阅读 · 0 评论