Leetcode
文章平均质量分 65
Leetcode经典例题
重生之我是数学王子
南京211本 信息与计算科学专业
展开
-
Leetcode 2466. 统计构造好字符串的方案数 入门dp(取模) C++实现
之间(包含上下边界)的字符串,那么这个字符串我们称为。由于答案可能很大,请将结果对。如果通过以上过程得到一个。请你返回满足以上要求的。以上操作可以执行任意次。原创 2024-10-10 11:35:01 · 470 阅读 · 0 评论 -
Leetcode 50. Pow ( x , n ) 快速幂、取模 C++实现
快速幂 取模原创 2024-10-10 11:21:07 · 411 阅读 · 0 评论 -
Leetcode 377. 组合总和Ⅳ 入门dp C++实现
入门dp原创 2024-10-08 16:44:02 · 427 阅读 · 0 评论 -
Leetcode 746. 使用最小花费爬楼梯 入门dp C++实现
一叶知秋,整个递归中有大量重复递归调用(递归入参相同)。这意味着每次循环,只需要知道「上一个状态」和「上上一个状态」的 f 值是多少,分别记作。如果一个状态(递归入参)是第一次遇到,那么可以在返回前,把状态及其结果记到一个。到底表示第一次遇到这个状态,还是表示之前遇到过了,从而导致记忆化失效。我们可以去掉递归中的「递」,只保留「归」的部分,即自底向上计算。相当于之前是用递归去计算每个状态,现在是枚举并计算每个状态。,那么对于下一轮循环来说:「上上一个状态」就是。每次循环,计算出新的状态。原创 2024-10-08 10:33:50 · 715 阅读 · 0 评论 -
Leetcode 739.42. 每日温度 接雨水 单调栈 C++实现
单调栈原创 2024-09-27 11:00:55 · 473 阅读 · 0 评论 -
Leetcode 968. 监控二叉树 树形dp、状态机 C++实现
树形dp原创 2024-09-27 06:13:31 · 745 阅读 · 0 评论 -
Leetcode 337. 打家劫舍Ⅲ 树形dp C++实现
之外,每栋房子有且只有一个“父“房子与之相连。一番侦察之后,聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。两种情况,选 或者 不选。即 1、选当前节点 2、不选当前节点,取左右儿子的最大值。小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为 root。为二叉树的节点个数。每个节点都会递归恰好一次。类似,选了当前结点就不能选与之相连的结点了。最坏情况下,二叉树是一条链,递归需要。,那就不能选他的 两个儿子结点(这里我们分成两种情况,当前节点。,小偷能够盗取的最高金额。原创 2024-09-24 10:34:08 · 315 阅读 · 0 评论 -
Leetcode 2246. 相邻字符不同的最长路径(一般树)树形dp C++实现
请你找出路径上任意一对相邻节点都没有分配到相同字符的。考虑用树形 DP 求直径。对于本题的限制,我们可以在从子树。(即一个连通、无向、无环图),根节点是节点 0。,所以答案为最长路径的长度加。转移过来,所以对上述做法加个。转移过来时,仅考虑从满足。,并返回该路径的长度。,那么可以更新答案为从。原创 2024-09-23 16:53:13 · 511 阅读 · 0 评论 -
Leetcode 543. 124. 二叉树的直径 树形dp C++实现
所以分别求出左右子树的最大深度,然后相加放入 ans。被定义为一条节点序列,序列中每对相邻节点之间都存在一条边。到该条路径叶子结点的最大值,如果有分支,则比较左右大小,返回最大值。最坏情况下,二叉树退化成一条链,递归需要 O(n) 的栈空间。等价于由两条(或者一条)链拼成的路径。返回的是链的节点值之和,不是直径的节点值之和。的链的节点值之和,去更新答案的最大值。从叶子到当前节点的路径。给你一棵二叉树的根节点,返回该树的。其中 n 为二叉树的节点个数。节点,且不一定经过根节点。是路径中各节点值的总和。原创 2024-09-23 14:37:17 · 713 阅读 · 0 评论 -
Leetcode 1039. 多边形三角形剖分的最低得分 枚举型区间dp C++实现
把 dfs 改成 dp 数组,把递归改成循环就好了。相当于原来是用递归计算每个状态 ( i , j ) ,现在改用循环去计算每个状态 ( i , j )。动态规划的时间复杂度 = 状态个数 × 单个状态的计算时间。动态规划的时间复杂度 = 状态个数 × 单个状态的计算时间。边形,其每个顶点都有一个整数值。对于每个三角形,该三角形的值是顶点标记的。,三角剖分的分数是进行三角剖分后所有 n - 2。保存多少状态,就需要多少空间。,单个状态的计算时间为。转移过来,必须先计算出。,单个状态的计算时间为。原创 2024-09-23 11:01:09 · 569 阅读 · 0 评论 -
Leetcode 516. 最长回文序列 选与不选型区间dp C++实现
动态规划的时间复杂度 = 状态个数 × 单个状态的转移个数。子序列定义为:不改变剩余字符顺序的情况下,删除某些字符或者不删除任何字符形成的一个序列。动态规划的时间复杂度 = 状态个数 × 单个状态的转移个数。这里有一个通用的做法:盯着状态转移方程,想一想,要计算。什么时候要正序,什么时候要倒序?对于本题来说,可以用变量。,找出其中最长的回文子序列,并返回该序列的长度。保存多少状态,就需要多少空间。数组的第一个维度去掉。,而单个状态的转移个数为。,而单个状态的转移个数为。,两者不相等时,左指针。原创 2024-09-14 10:01:39 · 898 阅读 · 0 评论 -
Leetcode 188. 买卖股票的最佳时机 Ⅳ 状态机dp C++实现
可以是在买股票的时候,也可以是在卖股票的时候,这两种写法都是可以的。设计一个算法来计算你所能获取的最大利润。你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。由于最后未持有股票,手上的股票一定会卖掉,所以代码中的。也就是说,你最多可以买 k。是某支给定的股票在第 i。的基础上,添加一个参数。,表示当前可以至多交易。的修改时机为买入时。原创 2024-09-12 11:54:43 · 466 阅读 · 0 评论 -
Leetcode 309 买卖股票(含冷冻期) C++实现
设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票),卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。是访问不到的,所以下面翻译成递推时,无需初始化这个状态(不需要写。你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。天不能卖,只能从第 i−2 天没有股票的状态转移过来。的基础上,只需修改一处:在计算持有股票的状态时,把。请注意,这会导致边界条件多了一个。天一定卖了股票,而是在没有股票下的最优状态。 指的就是这个状态。原创 2024-09-09 16:04:24 · 187 阅读 · 0 评论 -
Leetcode122. 买卖股票 状态机dp C++实现
在每一天,你可以决定是否购买和/或出售股票。你也可以先购买,然后在 同一天 出售。遍历数组,与标记到的最低价进行比较,画一个折线图,将所有的上升(红色)线段加起来即可得到答案。数组时只用到了相邻的两个格子,所以为了节省空间,我们可以不使用数组,仅使用变量来存储数据。天时未持有股票一定比持有股票利润大,所以递归入口状态设置成。(持有)的情况,所以我们把这种情况的返回值设置成。天不可能持有股票,但是递归过程中,会出现第。股票,所对应的状态转移方程也不同,如下图。,遍历,列出状态转移方程。表示未持有股票的利润,原创 2024-09-09 15:00:35 · 536 阅读 · 0 评论 -
Leetcode 300. 最长递增子序列 记忆化搜索、贪心二分 C++实现
在函数的最后返回值时,要重新遍历递归的原因是:函数 dfs 传入的参数是子序列末尾数字的位置,末尾数字已经定了,所以要遍历一遍。数组的过程中,如果符合条件,则将其填入对应位置,按照上一方法的思路,如果是在数组最后添加元素,则填完元素后让。是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。数组的中间找到应该存放的位置,就替换掉这个元素(注意是替换不是插入)。数组中,所遍历到的元素应该存放的位置,利用。是数组 [0,3,1,6,2,2,7]的使用,改为原地修改,即在遍历。原创 2024-09-07 13:39:40 · 977 阅读 · 0 评论 -
Leetcode 72. 编辑距离 动态规划 优化 C++实现
有四种情况,两个字母相等,这个位置就不用操作,向前继续递归;如果不相等,可以插入字母、删除字母、替换字母,取操作数最小的一个。行,每次递推只会取它的上一个格子的值,所以可以利用循环数组,来有效降低空间复杂度。你可以对一个单词进行如下三种操作:插入一个字符,删除一个字符,替换一个字符。中插入字母,那么这个位置的问题就解决了,这个时候要让。中前两行代码表示的意思是,如果在递归过程中出现了。列,先赋最大值,即当前位置可能出现的最大值。进入 dfs 函数。当前字母相等,则 这个位置的操作数。的指针前移,继续递归。原创 2024-09-05 16:09:54 · 1172 阅读 · 0 评论 -
Leetcode 1143. 最长公共子序列 记忆化搜索 优化 C++实现
是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。:如果两个字符相同,那么两个指针同时向后移动一个位置,进入下一层递归,计数器。的上一个值(没在本轮更新过的值)。时,如果出现相同的字母,不会重复计算。值都相同,因为如果这两个元素不相等,如果前面的。,这样不会出现元素重复计算的情况,因为无论。当前正遍历到的元素 相等,他们更新的。的列空间只用到了相邻的两个位置,即。的元素的最长子序列长度。,返回这两个字符串的最长。更新后,也就是此时的。原创 2024-09-03 17:17:55 · 602 阅读 · 0 评论 -
Leetcode 494. 目标和 01背包问题 C、C++实现
最后当枚举到最后一个元素时判断是否满足条件,满足。返回可以通过上述方法构造的、运算结果等于。,然后串联起所有整数,可以构造一个。向数组中的每个整数前添加 '+'给你一个非负整数数组 nums。--> 加上之前枚举的情况。--> 减去之前枚举的情况。所以要求负数的绝对值和为。和一个整数 target。看到题目容易想到的就是。原创 2024-09-03 14:37:44 · 622 阅读 · 0 评论 -
Leetcode 198. 打家劫舍 基础动态规划 C++实现
你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果这个房子已经被计算过了,就不必递归,可以直接返回本身已经被计算过的值。如果这个房子没有被计算过,此时有两种选择,选这个房子或者不选,给定一个代表每个房屋存放金额的非负整数数组,计算你。由上图可知,变换完成后数组要向后拓展两个位置。,一夜之内能够偷窃到的最高金额。,即没有可以被计算的房子了,,代表没有被计算过。函数,递归边界条件为。原创 2024-08-29 14:30:31 · 662 阅读 · 0 评论 -
Leetcode 51. 皇后 回溯 C++实现
函数,从第一行开始,进入递归,遍历当前行的每一列,找到满足条件的,有两种选择,选这个位置或者不选。按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。不选,恢复现场,注意,已经存入数据的。的棋盘上,并且使皇后彼此之间不能相互攻击。每一种解法包含一个不同的。的棋子放置方案,该方案中。分别代表了皇后和空位。,因为可以直接覆盖。原创 2024-08-28 21:02:53 · 659 阅读 · 0 评论 -
Leetcode 46. 全排列 排列型回溯 C++实现
表示该数字已经被挑选。下一层递归完毕返回该层后,将该层挑选的数字所对应的。,即未被挑选状态),恢复现场。时,即已经排列完毕,则可以。给定一个不含重复数字的数组。遍历,如果没选过就加入。原创 2024-08-28 19:56:09 · 319 阅读 · 0 评论 -
Leetcode 22. 括号生成 回溯 C++实现
代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且。原创 2024-08-28 17:12:38 · 739 阅读 · 0 评论 -
Leetcode 216.组合总和Ⅲ 回溯+剪枝 C++实现
该列表不能包含相同的组合两次,组合可以以任何顺序返回。如果剩余数字不符合条件,则直跳过,进入下一个循环。所有可能的有效组合的列表。即剩余应选数字个数为。原创 2024-08-28 16:11:13 · 407 阅读 · 0 评论 -
Leetcode 77. 组合 组合型回溯 C++实现
减去 已经选过的数字个数,也就是数组。个数字(用一共要选的数字个数。时证明选完了,执行完就。问题:给定两个整数 n。原创 2024-08-28 15:04:50 · 319 阅读 · 0 评论 -
Leetcode 131.分割回文串 回溯 C++实现
时,证明已经递归到最后一个元素,执行完就可以。数组中,然后进入下一层递归。从 i 到末尾,如果是回文就加入到。中,最后恢复现场准备进入下一次递归。分割成一些子串,使每个子串都是。所有可能的分割方案。原创 2024-08-28 14:14:33 · 435 阅读 · 0 评论 -
Leetcode 78 子集 回溯 C++实现
每次都是选或不选,递归次数为一个满二叉树的节点个数,那么一共会递归 O(2ⁿ) 次(等比数列和),再算上加入答案时复制 path 需要 O(n) 的时间,所以时间复杂度为 O(n2ⁿ)。答案的长度为子集的个数,即 2ⁿ,同时每次递归都把一个数组放入答案,因此会递归 2ⁿ次,再算上加入答案时复制 path 需要 O(n) 的时间,所以时间复杂度为 O(n2ⁿ)。中,然后进入下一个递归(决定后面的元素选不选),递归完毕后,要删除尾端元素,恢复现场(把这个递归周期中加进。数组里的元素都已经递归完毕,则可以。原创 2024-08-28 08:57:48 · 389 阅读 · 0 评论 -
Leetcode 98 验证二叉搜索树 C++实现
不能单独判断该结点的左孩子结点是否小于他,右孩子结点是否大于他,必须要求整个子树都符合条件才可。,判断其是否是一个有效的二叉搜索树。,结点的右子树必定全部大雨该结点值。结点的左子树必定全部小于该结点值。值,再令其满足其他条件即可。给你一个二叉树的根节点。,所以创立新函数导入。原创 2024-08-27 21:26:28 · 325 阅读 · 2 评论 -
Leetcode 1108. IP地址无效化 C++实现
返回这个 IP 地址的无效化版本。所谓无效化 IP 地址,其实就是用。直接使用replace方法进行替换。对字符串挨个进行判断,如果是。原创 2024-08-24 12:12:28 · 374 阅读 · 0 评论 -
Leetcode 100.101.110.199 二叉树相同/对称/平衡 C++实现
根节点不用判断,只需判断左子树的右子树和右子树的左子树是否相等,以及左子树的左子树和右子树的右子树是否相等即可。,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。在过程中,如果检测出有子树不是平衡二叉树,则。如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。是指该树所有节点的左右子树的深度相差不超过。,编写一个函数来检验这两棵树是否相同。判断根结点,如果都为空则相等,返回。中,如果已经填入则跳到下一深度。, 检查它是否轴对称。不成立,判断根结点的值。原创 2024-08-24 11:24:38 · 534 阅读 · 0 评论 -
Leetcode 104. 二叉树的最大深度 C++实现
最坏情况下,二叉树退化成一条链,递归需要 O(n) 的栈空间。最坏情况下,二叉树退化成一条链,递归需要 O(n) 的栈空间。是指从根节点到最远叶子节点的最长路径上的节点数。其中 n 为二叉树的节点个数。其中 n 为二叉树的节点个数。,每向下递归一次就更新一次。给定一个二叉树root。原创 2024-08-23 11:41:28 · 411 阅读 · 0 评论 -
Leetcode 237.19.83.82 删除链表重复结点 C++实现
不是链表中的最后一个节点。, 删除原始链表中所有重复数字的节点,只留下不同的数字。返回已排序的链表。, 删除所有重复的元素,使每个元素只出现一次。步,然后左右指针一起向右走,当右指针指向最后一个结点时,左指针。如果出现重复的结点,则用下一个结点覆盖它。问题:给你一个链表,删除链表的倒数第。存储重复出现的元素值,一旦有结点的值与。,我们想删除它其中的一个节点node。遇到相同元素值的结点,全部删除。给定一个已排序的链表的头head。给定一个已排序的链表的头head。个结点,并且返回链表的头结点。原创 2024-08-22 16:01:34 · 607 阅读 · 0 评论 -
Leetcode 876.141.142.143 环形链表 C++实现
指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数 pos。指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数。,请你找出并返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。,返回链表开始入环的第一个节点。,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪。不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。来表示链表尾连接到链表中的位置(索引从 0 开始)。来表示链表尾连接到链表中的位置(,仅仅是为了标识链表的实际情况。原创 2024-08-22 10:13:54 · 849 阅读 · 0 评论 -
Leetcode 206.92.25 反转链表 C++实现
算法:先统计结点个数,然后每组单独处理,类似上一题,连接完结点后将。是一个正整数,它的值小于或等于链表的长度。你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。,先找到 left 位置的前驱结点,然后反转从。的整数倍,那么请将最后剩余的节点保持原有顺序。个节点一组进行翻转,请你返回修改后的链表。,请你反转链表,并返回反转后的链表。位置的所有结点,最后连接两端。给你单链表的头节点 head。给你单链表的头指针 head。给你链表的头节点 head。指向下一组开始的地方。不为空时,一直反转。原创 2024-08-20 13:20:26 · 278 阅读 · 0 评论 -
Leetcode 162.153.33. 二分法 C++实现
解决,如果mid指针所指元素 < 右边元素,则从左边找答案;如果mid指针所指元素 < 右边元素,则从右边找答案。,它原来是一个升序排列的数组,并按上述情形进行了多次旋转。,找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回。峰值元素是指其值严格大于左右相邻值的元素。如果 target 在第一段,那么。如果 target 在第二段,那么。的数组,预先按照升序排列,经由。可以在第一段,也可以在第二段。,则返回它的下标,否则返回。你必须设计一个时间复杂度为。次旋转后,得到输入数组。原创 2024-08-19 14:15:17 · 949 阅读 · 0 评论 -
Leetcode 34. 二分查找 C++实现
请你找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值。你必须设计并实现时间复杂度为。第一次出现的位置,这个位置为。数组中不存在这个元素,指针。指针,二分查找,左指针。原创 2024-08-17 09:41:49 · 366 阅读 · 0 评论 -
Leetcode 209,713,3 滑动窗口 C++实现
右移,满足条件则计入总数(以满足条件时的右指针为准),若。滑动窗口,左右两个指针,从最左边开始遍历,右指针。右移,直到将重复元素消除,再更新窗口长度最大值。,请你返回子数组内所有元素的乘积严格小于。如果不存在符合条件的。滑动窗口,从左边开始,慢慢将右指针。找出该数组中满足其总和大于等于。右移寻找下一个符合条件的子数组。,请你找出其中不含有重复字符的。右移,出现重复元素则让左指针。个正整数的数组和一个正整数。都符合条件,则计算出公式。原创 2024-08-16 15:21:03 · 811 阅读 · 0 评论 -
Leetcode 11.42. 接雨水 C++实现
前后缀和原创 2024-08-15 13:53:18 · 561 阅读 · 0 评论 -
leetcode 70. 爬楼梯 入门dp C++实现
入门dp原创 2024-08-12 21:32:34 · 333 阅读 · 0 评论 -
Leetcode 167. 两数之和 C++实现
是因为要留出右面两个指针的位置。因为规定答案中不可以包含重复的三元组,所以要跳过 i 的重复数字。,该数组已按非递减顺序排列,请你从数组中找出满足相加之和等于目标数。你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。由于提供的数组为递增数组,使用双指针策略,左指针。你所设计的解决方案必须只使用常量级的额外空间。指针所指的这个数加上它右面相邻的两个数仍。注意:答案中不可以包含重复的三元组。,则右指针左移,反之左指针右移。的形式返回这两个整数的下标。中最大的两个数的两个数仍。原创 2024-08-13 13:28:40 · 602 阅读 · 0 评论