![](https://img-blog.csdnimg.cn/direct/4d0476c5d98e4c359830ce92ae503162.jpeg?x-oss-process=image/resize,m_fixed,h_224,w_224)
算法
文章平均质量分 97
讲解常见的算法以及分类总结算法题目
编程之路,妙趣横生
仰望星空,脚踏实地
展开
-
【动态规划七】背包问题
1049. 最后一块石头的重量 II - 力扣(LeetCode)1.题目解析之前我们已经在博客中讲解了"最后一块石头的重量 I", 每次选两块最重的石头,而本题每次随机选两个石头进行碰撞,如果最后还剩余了一块石头,那么求最终剩余石头的最小重量,如果没有剩余石头,那么返回02.算法分析本题的难点仍然在于如何把原问题进行转化,假设给定的数组元素是[a, b, c, d, e]每次随机选两个石头进行碰撞, 可以发现最终结果无非是给原始数组元素添加上正负号,使得最终。原创 2024-05-24 11:45:55 · 716 阅读 · 0 评论 -
【动态规划六】两个数组的dp问题
上图是根据最后一个位置的状态划分问题得到的状态转移方程,但显然p[j]=='*'时,还需要一层for循环求解, 因此时间复杂度是O(N^3), 因此我们可以进一步优化, 将p[j]=='*'时的状态转移方程用若干个有限的状态表示。dp[i][j]: s1中 [1, i] 区间内的字符串以及 s2[1, j] 区间内的字符串,能拼接成 s3[1, i+j] 区间内的字符串。这两个字符串就是可以匹配的,让第二个字符串的'*'匹配空串,'a'匹配'a', '*'匹配"bcde", 'f'匹配'f'即可。原创 2024-05-20 08:35:19 · 1033 阅读 · 0 评论 -
BFS算法专题
因为图中可能有环,所以删除到只剩下这个环时,此时没有入度为0的点了,但图中还有点,说明是个环,拓扑排序也就结束了!!!原创 2024-05-17 11:24:25 · 814 阅读 · 0 评论 -
【动态规划五】回文串问题
将dp表里面所有的值都初始化成1, 因此dp[i] += dp[i-1] 即可。如果是暴力解法,只需要先固定下标i, 然后j从i的位置开始往后一路枚举即可,下一次i++, j无需回到0号下标,因为[i, j]与[j, i]本质是同一个子串,j直接从i位置开始枚举即可, 因此我们就把状态表示定义成二维的~s[i] == s[j]时,i + 1 == j 的情况可以合并到 i + 1 > j的情况中,因为i + 1 > j 时用到的dp[i+1][j-1]本质是下三角元素,直接等于0,不影响结果的正确性。原创 2024-05-15 22:40:10 · 665 阅读 · 0 评论 -
队列 + 宽搜(BFS)
二叉树根节点从1开始编号,创建一个队列,队列中存储的是<节点指针,节点编号>, 如果算上空节点的话那么二叉树就是满的,所以如果某个节点编号是x,那么左孩子节点编号是2*x, 右孩子节点编号是2*x+1, 每一层的长度就是 最右节点编号 - 最左节点编号 + 1, 而我们可以直接用vector来模拟队列~树的层序遍历是典型要用到队列的场景,因为上一层遍历完之后,遍历下一层是从左到右,也就是要先遍历上一层最左节点的孩子,因此符合先进先出的原则,采用队列!102. 二叉树的层序遍历 - 力扣(LeetCode)原创 2024-05-11 17:34:00 · 930 阅读 · 0 评论 -
【动态规划四】子序列问题
给定一个数组,数组每个元素是一个数对[left, right], left 是严格 < right 的,[a, b], [c, d], [e, f]要能构成数对链,要求b < c, d < e, 求能构成的最长数对链的长度。ps:开始是定义的dp[i], 但是推不出状态转移方程, 因为只知道子序列的个数,但是无法确定具体的斐波那契式的子序列,也就无法根据dp[i]前面的值推导出dp[i]~dp[i][j]:以 i 位置 以及 j 位置 为结尾的所有子序列中,最长的等差序列的长度。原创 2024-05-13 09:40:02 · 984 阅读 · 0 评论 -
【动态规划三】子数组系列
f[i]:以 i 位置为结尾的所有子数组中,最后呈现 "上升" 状态下的最长的湍流子数组的长度。g[i]:以 i 位置为结尾的所有子数组中,最后呈现 "下降" 状态下的最长的湍流子数组的长度。数组中相邻元素对之间的大小关系相反,这就是湍流数组,题目要求返回数组中最长的湍流子数组的长度。将dp表里面所有的值都初始化成1, 因此dp[i] += dp[i-1] 即可。dp[i]: [0, i]区间内的字符串, 能否被字典中的单词拼接而成。dp[i] 表示 以 i 位置元素为结尾的所有子数组的最大和。原创 2024-05-07 09:38:31 · 846 阅读 · 1 评论 -
优先级队列(堆)
1046. 最后一块石头的重量 - 力扣(LeetCode)1.题目解析每次选取最重的两块石头,两两碰撞,重量小的粉碎,重量大的石头剩余重量为原始重量-重量小的石头的重量,最终如果剩一块石头,就返回该石头的重量;如果没有剩石头,就返回02.算法分析用堆(优先级队列) 模拟即可3.算法代码public://默认大堆heap.pop();heap.pop();原创 2024-05-14 17:32:23 · 990 阅读 · 0 评论 -
【算法系列】栈
目录leetcode题目一、删除字符串中的所有相邻重复项二、比较含退格的字符串三、基本计算器 II四、字符串解码五、验证栈序列六、有效的括号七、最小栈八、逆波兰表达式求值九、用栈实现队列十、用队列实现栈1047. 删除字符串中的所有相邻重复项 - 力扣(LeetCode)https://leetcode.cn/problems/remove-all-adjacent-duplicates-in-string/1.题目解析2.算法分析显然该题是要用栈,遍历字符串,当遍历到的元素和栈顶元素一样时,就让栈顶元素出原创 2024-05-05 20:31:45 · 383 阅读 · 0 评论 -
【动态规划二】简单多状态dp问题
【动态规划一】斐波拉契数列模型 && 路径问题-CSDN博客状态表示是指dp表(一维数组/二维数组)里面的值所表示的含义如何得到状态表示?1.1 题目要求1.2 经验 + 题目要求1.3 分析问题的过程中,发现重复子问题。面试题 17.16. 按摩师 - 力扣(LeetCode)给定一个数组,数组元素表示预约时间,不能选择数组相邻元素,求最长的预约时长dp[i]: 选择到 i 位置的时候,此时的最长预约时长--->i位置可以选,可以不选,进一步细化。原创 2024-05-04 17:31:20 · 900 阅读 · 0 评论 -
【算法系列】字符串
字符串最后一个单词的长度_牛客题霸_牛客网 (nowcoder.com)1.题目解析字符串中的单词以空格分割,求出字符串最后一个单词的长度2.算法分析直接调用string类的接口rfind, 从右向左找到第一个空格位置pos即可,用字符串总长度-pos-13.算法代码int main()string s;return 0;原创 2024-05-03 19:07:10 · 1206 阅读 · 1 评论 -
【动态规划一】斐波拉契数列模型 && 路径问题
状态表示是指dp表(一维数组/二维数组)里面的值所表示的含义如何得到状态表示?1.1 题目要求1.2 经验 + 题目要求1.3 分析问题的过程中,发现重复子问题。原创 2024-05-02 15:48:30 · 656 阅读 · 0 评论 -
【算法系列】哈希表
1.存储数据的容器2.需要快速查找数据时,用哈希表3.当题目中给定的字符串或者数组只包含小写字母或数据范围是0~100/1000等等时,可以用数组模拟哈希表4.当数据范围是负数到正数时,不建议用数组模拟哈希表,因为还要加一个数转化之后进行映射,建议直接使用STL容器leetcode题目一、两数之和1. 两数之和 - 力扣(LeetCode)1.题目解析给定数组与target, 返回和为target的两个元素下标2.算法分析解法一: 暴力枚举。原创 2024-05-01 19:29:35 · 730 阅读 · 1 评论 -
【算法系列】链表
如上图所示,要将cur插入到两个节点之间,那么①与②的顺序就不能颠倒,但是如果定义了一个指针变量next,就完全不用考虑链接顺序了!①②③④可以任意颠倒~原创 2024-04-30 21:11:36 · 791 阅读 · 1 评论 -
分治策略 --- 快排&&归并
此时如果nums[cur1] > nums[cur2], 说明cur1连同cur1之前的左区间元素都比nums[cur2]大, 此时如果统计了逆序对数量,cur1++之后来到下一个位置,此时nums[cur1]依旧可能 > nums[cur2], 还要统计逆序对数量,就会重复计算!ps: 由合并两个有序数组的逻辑知,哪个指针指向的元素小,就让哪个指针++, 因此[left, cur1-1]区间的所有值都比nums[cur2]小~215. 数组中的第K个最大元素 - 力扣(LeetCode)原创 2024-04-28 23:12:49 · 742 阅读 · 0 评论 -
【算法系列】模拟
给定一个数组,数组每个元素表示发起攻击(被攻击后会中毒)的时间,给定一个整数,表示中毒的时长,如果中毒还没有结束,就发起下次攻击,那么中毒时间被重置!2.遇到c字符,找最后一个字符(本题是k字符)在哈希表是否存在,存在则最后一个字符个数--,当前字符++, 不存在则当前字符++1.遇到r/o/a/k字符,在哈希表中找一下前驱字符,如果存在,前驱个数--, 当前字符++, 不存在,则返回-1。最后还要检查记录字符出现个数的哈希表情况,如果前n-1个字符中有个数不为0的字符,也要返回-1。原创 2024-04-28 13:20:09 · 869 阅读 · 0 评论 -
位运算总结
只想把如下图所示的0修改成1,只需要给这一位按位或1,其他位按位或0即可!原创 2024-04-27 11:47:06 · 929 阅读 · 0 评论 -
前缀和算法
如果题目要求的是 arr数组 [l, r] 的和, 那么我们可以间接求,用[1, r]区间的和 减去 [1, l-1]区间的和求实[l, r]区间的和, 而[1, r]区间的和是dp[r], [1, l-1]的和是 dp[l-1], 而dp数组我们已经预处理好了,因此求和只需要O(1)的时间复杂度。如果从1开始计数,求的是[1, 2]区间的和, 那么 结果就是 dp[2] - dp[0], 在预处理数组时只需要让dp[0] = 0 即可, 求出来的就是dp[2],也就是[1, 2]区间的和。原创 2024-04-24 23:29:49 · 568 阅读 · 0 评论 -
二分查找算法
34. 在排序数组中查找元素的第一个和最后一个位置 - 力扣(LeetCode)1.题目解析1.数组中存在要查找的值,返回该值的起始下标和结束下标(因为该值可能不止一个)2.不存在要查找的值,返回[-1, -1]3.数组为空,返回[-1, -1]2.算法分析2.1 暴力解法: 从前向后遍历一遍,记录起始下标和结尾下标~原创 2024-04-23 22:20:46 · 714 阅读 · 0 评论 -
滑动窗口算法
1.有效字符指的是哈希表1中的字符对应的个数原创 2024-04-22 18:25:23 · 784 阅读 · 0 评论 -
双指针算法
目录题目类型leetcode题目:一、移动零二、复写零 三、快乐数四、 盛最多水的容器五、有效三角形的个数 六、查找总价格为目标值的两个商品七、三数之和八、四数之和 题目如果要求是根据某个标准,对数组进行划分/分块,将数组可以分为几个部分,此时就可以采用双指针算法! 双指针算法不一定非要用指针,下标也可以充当指针! 链表题目也经常会用到双指针,比如求链表的中间节点,求链表的倒数第k个节点,判断链表是否有环,求链表的入环节点,相交链表等等。。。 其他应用双指针算法的题原创 2024-04-20 16:19:18 · 776 阅读 · 0 评论 -
字符串匹配算法之BF与KMP算法
如果子串中,有大量的重复元素时,next数组就可以优化,因为假设6号下标匹配失败,回退到next[6]也就是5号下标, 此时字符仍然是'a', 依旧会匹配失败,还需要继续回退!子串的第一个位置和第二个位置匹配失败时,该位置之前绝不可能用公共子串,所以next[0]和next[1]都应该是0, 但是为了方便后续代码处理,我们将next[0]置成-1。我们现在已经明白了next数组的做用和求法,但问题是上面的next数组是我们肉眼观察求得的,可是计算机并没有上帝视角,如何编程求得next数组呢?原创 2024-04-08 22:34:21 · 751 阅读 · 0 评论