Day 42 动态规划part04 : 01背包问题,你该了解这些! 01背包问题,你该了解这些! 滚动数组 416. 分割等和子集 动态规划(Dynamic Programming,简称 DP)是解决优化问题的一种常用策略,其中“背包问题”是动态规划中最经典的问题之一。
Day 39 动态规划part02 : 62.不同路径 63. 不同路径 II 机器人试图达到网格的右下角(在下图中标记为 “Finish” )。机器人试图达到网格的右下角(在下图中标记为 “Finish”)。现在考虑网格中有障碍物。网格的左上角 (起始点在下图中标记为 “Start” )。网格的左上角 (起始点在下图中标记为 “Start” )。1. 向右 -> 向右 -> 向下 -> 向下。2. 向下 -> 向下 -> 向右 -> 向右。1. 向右 -> 向下 -> 向下。2. 向下 -> 向下 -> 向右。3. 向下 -> 向右 -> 向下。3x3 网格的正中间有一个障碍物。
Day 38 动态规划part01 : 理论基础 509. 斐波那契数 70. 爬楼梯 746. 使用最小花费爬楼梯 F(n) = F(n - 1) + F(n - 2),其中 n > 1。开始,后面的每一项数字都是前面两项数字的和。你有多少种不同的方法可以爬到楼顶呢?1. 1 阶 + 1 阶 + 1 阶。debug方法: 打印dp数组。的,对于刷题来说就够用了。表示)形成的序列称为。有两种方法可以爬到楼顶。1. 1 阶 + 1 阶。有三种方法可以爬到楼顶。2. 1 阶 + 2 阶。3. 2 阶 + 1 阶。
Day 34 贪心算法 part03 : 1005.K次取反后最大化的数组和 134. 加油站 135. 分发糖果 你无法返回 2 号加油站,因为返程需要消耗 4 升汽油,但是你的油箱只有 3 升汽油。开往 3 号加油站,你需要消耗 5 升汽油,正好足够你返回到 3 号加油站。开往 4 号加油站,此时油箱有 4 - 1 + 5 = 8 升汽油。开往 1 号加油站,此时油箱有 7 - 3 + 2 = 6 升汽油。开往 2 号加油站,此时油箱有 6 - 4 + 3 = 5 升汽油。开往 0 号加油站,此时油箱有 4 - 3 + 2 = 3 升汽油。开往 1 号加油站,此时油箱有 3 - 3 + 3 = 3 升汽油。
Day 36 贪心算法 part05 : 435. 无重叠区间 763.划分字母区间 56. 合并区间 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。区间 [1,4] 和 [4,5] 可被视为重叠区间。表示若干个区间的集合,其中单个区间为。请你合并所有重叠的区间,并返回。
Day 32 贪心算法 part02 : 122.买卖股票的最佳时机II 55. 跳跃游戏 45.跳跃游戏II 给你一个整数数组prices,其中prices[i]表示某支股票第i天的价格。在每一天,你可以决定是否购买和/或出售股票。你在任何时候只能持有股票。你也可以先购买,然后在出售。返回你能获得的利润。7在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5 - 1 = 4。随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6 - 3 = 3。
Day 31 贪心算法 part01 : 理论基础 455.分发饼干 376. 摆动序列 53. 最大子序和 贪心的本质是选择每一阶段的局部最优,从而达到全局最优。这么说有点抽象,来举一个例子:例如,有一堆钞票,你可以拿走十张,如果想达到最大的金额,你要怎么拿?指定每次拿最大的,最终结果就是拿走最大数额的钱。每次拿最大的就是局部最优,最后拿走最大数额的钱就是推出全局最优。再举一个例子如果是 有一堆盒子,你有一个背包体积为n,如何把背包尽可能装满,如果还每次选最大的盒子,就不行了。这时候就需要动态规划。动态规划的问题在下一个系列会详细讲解。本篇给出了什么是贪心以及大家关心的贪心算法固定套路。
Day 30 回溯算法part06 : 332.重新安排行程 51. N皇后 37. 解数独 总结 所以回溯法也经常和二叉树遍历,深度优先搜索混在一起,因为这两种方式都是用了递归。回溯法就是暴力搜索,并不是什么高效的算法,最多再剪枝一下。
Day 28 回溯算法part04 : 93.复原IP地址 78.子集 90.子集II 其中可能包含重复元素,请你返回该数组所有可能的子集(幂集)。,用以表示一个 IP 地址,返回所有可能的。返回的解集中,子集可以按。返回该数组所有可能的子集(幂集)。正好由四个整数(每个整数位于。之间组成,且不能含有前导。给定一个只包含数字的字符串。,这些地址可以通过在。
Day 27 回溯算法part03 : 39. 组合总和 40.组合总和II 131.分割回文串 2 和 3 可以形成一组候选,2 + 2 + 3 = 7。注意 2 可以使用多次。如果至少一个数字的被选数量不同,则两种组合是不同的。中的每个数字在每个组合中只能使用。7 也是一个候选, 7 = 7。是正着读和反着读都一样的字符串。,并以列表形式返回。分割成一些子串,使每个子串都是。中可以使数字和为目标数。对于给定的输入,保证和为。给定一个候选人编号的集合。解集不能包含重复的组合。中所有可以使数字和为。所有可能的分割方案。
Day 25 回溯算法part02 : 216.组合总和III 17.电话号码的字母组合 找出所有相加之和为n的k返回所有可能的有效组合的列表。该列表不能包含相同的组合两次,组合可以以任何顺序返回。= 3,= 7[[1,2,4]]没有其他符合的组合了。= 3,= 9没有其他符合的组合了。[]不存在有效的组合。在[1,9]范围内使用4个不同的数字,我们可以得到的最小和是1+2+3+4 = 10,因为10 > 1,没有有效的组合。
Day 24 回溯算法part01 : 理论基础 77. 组合 回溯是一种通过穷举所有可能的候选解来找出所有解的算法。如果候选解被确认不是一个解的话(或至少不是最后一个解),回溯算法会通过在上一步进行一些变化来消除该候选解,然后重新尝试。
Day 23 二叉树part09: 669. 修剪二叉搜索树 108.将有序数组转换为二叉搜索树 538.把二叉搜索树转换为累加树 总结篇 二叉树是一种特殊的树,其中每个节点最多有两个子节点,通常称为左子节点和右子节点。
Day 22 二叉树part08: 235. 二叉搜索树的最近公共祖先 701.二叉搜索树中的插入操作 450.删除二叉搜索树中的节点 中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(例如,给定如下二叉搜索树: root = [6,2,8,0,4,7,9,null,null,3,5]给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。, 因为根据定义最近公共祖先节点可以为节点本身。
Day 21 二叉树part07: 530.二叉搜索树的最小绝对差 501.二叉搜索树中的众数 236. 二叉树的最近公共祖先 中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。因为根据定义最近公共祖先节点可以为节点本身。的最近公共祖先是节点。的最近公共祖先是节点。
Day 19 二叉树part06: 654.最大二叉树 617.合并二叉树 700.二叉搜索树中的搜索 98.验证二叉搜索树 我们为每个节点跟踪一个上界和下界,确保每个节点的值在这些边界内。根节点的值是 5 ,但是右子节点的值是 4。,判断其是否是一个有效的二叉搜索树。给你一个二叉树的根节点。
Day 18 二叉树part05: 513.找树左下角的值 112. 路径总和 113.路径总和ii 106.从中序与后序遍历序列构造二叉树 105.从前序与中序遍历序列构造二叉树 不存在 sum = 5 的根节点到叶子节点的路径。由于树是空的,所以不存在根节点到叶子节点的路径。的路径,这条路径上所有节点值相加等于目标和。是同一棵树的后序遍历,请你构造并返回这颗。等于目标和的根节点到叶节点路径如上图所示。路径总和等于给定目标和的路径。(1 --> 2): 和为 3。(1 --> 3): 和为 4。,请构造二叉树并返回其根节点。和一个表示目标和的整数。是指没有子节点的节点。是指没有子节点的节点。是二叉树的中序遍历,
Day 17 二叉树part04: 110.平衡二叉树 257. 二叉树的所有路径 404.左叶子之和 (赋值表达式,海象操作符)主要是为了避免多次调用相同的函数或重复的计算,从而使代码更简洁。如果你认为普通的方式(如你所示的代码)更容易阅读和理解,完全可以这样写。总之,这段代码的核心思想是:在计算树的高度的过程中,如果发现某个子树的左右子树高度差大于 1,立即返回。函数是主要的接口,它会返回 True 或 False,表示树是否平衡。给定一个二叉树,判断它是否是高度平衡的二叉树。的左右两个子树的高度差的绝对值不超过 1。函数是一个递归函数,用于计算二叉树的高度。的左右两个子树的高度差的绝对值不超过 1。