- 博客(37)
- 收藏
- 关注
原创 leetcode 刷题_day45_动态规划05_01背包问题应用(容量能够装满、容量尽量装满、有几种装法、两重容量)
从整体上看,如果尽量让石头分成重量相同的两堆,则这两堆相撞之后剩下的石头最小。前面讲过,如果使用一维 dp,则遍历顺序一定为先正序物品,后倒序背包容量。目标是一半重量(非整数则向下取整),差额的两倍就是最小剩下重量。将数组拆分成两个子集,左子集为加的数集合,右子集为减的数集合。那么凑整dp[5]有多少方法呢,也就是把 所有的。本题,相当于背包里放入数值,那么物品i的重量是。此时问题就转化为,装满容量为 x 的背包,有。是在公式中一切递推结果的起源,如果。例如:dp[j],j 为5,)这么大容量的包,有。
2023-10-22 23:47:02 87
原创 leetcode 刷题_day44_动态规划04_01背包问题
有n件物品和一个最多能背重量为w的背包。第i件物品的重量是weight[i],得到的价值是value[i]。每件物品,求解将哪些物品装入背包里物品价值总和最大。
2023-10-21 02:46:45 226
原创 leetcode 刷题_day43_动态规划03
只需要初始化dp[0]就可以了,推导的基础,都是dp[0]。从定义上来讲,空节点也是一棵二叉树,也是一棵二叉搜索树。的定义,需要对自身就是最大值的数。为节点组成的二叉搜索树的个数。从递推公式上,应当从小到大遍历。所以初始化dp[0] = 1。进行自定义初始化,也即。一定是从前向后遍历,先有。的最大乘积 * 拆解。
2023-10-20 21:29:39 42
原创 leetcode 刷题_day42_动态规划02
一定都是1,因为从(0, 0)的位置到(i, 0)的路径只有一条。都是从其上方和左方推导而来,那么从左到右一层一层遍历就可以了。,只能有两个方向来推导出来,即。一致,区别在于对障碍物的处理。只有这两个方向过来。
2023-10-20 21:27:28 286
原创 leetcode 刷题_day41_动态规划01_熟悉五步曲
dp 数组的定义和下标。递推公式。dp 数组如何初始化,初始化也需要注意。遍历顺序,比较考究,01 先遍历背包,后遍历物品。4.1 排列和组合的遍历顺序是不相同的。4.1.1 排列:背包在外 物品在内。(322)4.1.2 组合:物品在外,背包在内。(518)(出现问题)打印dp数组。(打印dp数组,检查是否有问题,检验1 2 3 4 步骤)
2023-10-17 21:28:38 22
原创 leetcode 刷题_day39_贪心06_局部最优推出全局最优
例如:98,一旦出现strNum[i - 1] > strNum[i]的情况(非单调递增),首先想让strNum[i - 1]–,然后strNum[i]给为9,这样这个整数就是89,即小于98的最大的单调递增整数。从后向前遍历,就可以重复利用上次比较得出的结果了,从后向前遍历332的数值变化为:332 -> 329 -> 299。
2023-10-16 19:58:29 26
原创 leetcode 刷题_day37_贪心04_局部最优推出全局最优
因为降序排序后的列表里,其前面的所有元素都大于等于当前元素,所以直接根据 k 往前放置就行。不会出现往后放的情况,因为已经降序排序了,当前元素所在的位置可以视为最靠后。有两个维度要同时考虑的题目,需要将两个维度拆开,一个个去考虑操作。注意:对 int 进行排序时,需要使用。通过合并符合条件的区间,来实现局部最优。讲述看到这一题的思路。
2023-10-12 22:56:35 22
原创 leetcode 刷题_day36_贪心03_局部最优推出全局最优
先按绝对值降序排序,依次从头至尾将负值翻转,如果最后 k 还没用完,则将数组最后一个(值最小)的反复翻转。这样从局部最优推出了全局最优,即:相邻的孩子中,评分高的孩子获得更多的糖果。方法二中,非对象的自定义排序需要转成包装类才能进行,直接拖慢了整体效率。每次选择最小的值进行反转,实现每次最大,那最后整体最大。--> java 的非对象自定义排序有病。基于贪心算法,有两种解法。方法二:贪心解法优化。
2023-10-11 22:04:17 33
原创 leetcode 刷题_day35_贪心02_局部最优推出全局最优
最终利润是可以分解的,比如,计算第 0 天买入,第 3 天卖出的利润,就等于拆开单天理论总和。因此可以用贪心算法,只要每天为正的利润(局部最优),就能获得全局最大利润(全局最优)不一定非要明确一次究竟跳几步,每次取最大的跳跃步数,这个就是可以跳跃的。从覆盖范围出发,不管怎么跳,覆盖范围内一定是可以跳到的,这个范围内,别管是怎么跳的,反正一定可以跳过来。,覆盖范围一旦覆盖了终点,得到的就是最少步数。
2023-10-10 23:24:05 38
原创 leetcode 刷题_day34_贪心01_局部最优推出全局最优
局部最优:当前“连续和”为负数的时候立刻放弃,从下一个元素重新计算“连续和”,因为负数加上下一个元素 “连续和”只会比理论值小。如果 -2 1 在一起,计算起点的时候,一定是从 1 开始计算,因为负数只会拉低总和,这就是贪心贪的地方。局部最优(饼干发出去),推导出全局最优(饼干尺寸升序排序,把小孩胃口升序排序)局部最优的情况下,并记录最大的“连续和”,可以推出全局最优。当遇到“连续和”小于等于0时,重置连续和,也即立即中断。一次遍历,类似双指针计算差值判断符号。全局最优:选取最大“连续和”
2023-10-09 17:44:53 32
原创 leetcode 刷题_day32_回溯06_哈希表优化横向遍历
无论哪种解法,在遍历之前都需要将待遍历对向进行排序才能保证最终的。列表中找到符合条件的组合/排列,因此可以使用回溯来解题。注意:结果是有排序要求的,要求返回从小到大最小的结果。在回溯的横向遍历中,有两种解法。
2023-10-08 21:23:02 23
原创 leetcode 刷题_day30_回溯04_分割额外判断和分层控制&子集
使用回溯进行字符串切割,通过startIndex控制切割的位置,但只能递归两层,第三层需要取末尾,在终止条件中判断每个切割的字符串需要进行合法性判断剪枝优化。
2023-10-06 21:30:43 24
原创 leetcode 刷题_day27_回溯01_组合&剪枝
使用标准的回溯模板就能解题,回溯总是伴随着递归,回溯总是能图形化为一颗逻辑树模板本题的解题逻辑树。
2023-10-05 16:11:02 19
原创 leetcode 刷题_day23_二叉树09_BST 修剪 & 转换
根据 BST 的特性(有序),对 BST 进行遍历,对每个节点的值与 val 进行判断,最后遇到 null 就是需要插入的地方。
2023-10-02 19:43:52 23
原创 leetcode 刷题_day22_二叉树08_BST 搜索 & 插入 &删除
根据 BST 的特性(有序),对 BST 进行遍历,对每个节点的值与 val 进行判断,最后遇到 null 就是需要插入的地方。前序递归遍历,每次递归返回删除了节点的树/子树根节点。处理当前节点时,分为五种情况。待删除节点为当前节点。
2023-09-28 19:19:11 17
原创 leetcode 刷题_day21_二叉树07_中序遍历(双指针) & 后序遍历(回溯)
遇到在二叉搜索树上求什么最值啊,差值之类的,就把它想成在一个有序数组上求最值,求差值,这样就简单多了也即,在这个有序数组上求最小差值。
2023-09-27 19:36:46 19
原创 leetcode 刷题_day20_二叉树06_构造树 & 遍历多棵树 &BST
构造树一般采用的是,因为先构造中间节点,然后递归构造左子树和右子树数组区间为。
2023-09-26 22:19:12 23
原创 leetcode 刷题_day15_二叉树02_层级遍历 & 翻转
借助队列,层级一层循环,层内元素一层循环后续的层级遍历题目,都可以以类似的代码解决。
2023-09-24 20:24:44 22
原创 leetcode 刷题_day14_二叉树01_遍历
看如下中间节点的顺序,就可以发现,中间节点的顺序就是所谓的遍历方式。这里前中后,其实指的就是中间节点的遍历顺序,只要记住。解题时,一定要把握使用递归的三个步骤。
2023-09-20 19:17:44 16
原创 leetcode 刷题_day13_栈和队列03_单调队列&小顶堆
构建一个适用于本题的单调递减非去重队列注意,单调递减队列不能去重,否则会导致移除元素时误将窗口还在的数据被移除出去。
2023-09-19 19:49:51 29
原创 leetcode 刷题_day09_栈和队列_基础
队列是先进先出,栈是先进后出。基于栈的特性,如果倒腾两次,也是先进先出,和队列的特性一致。因此可以用两个栈配合,来实现先进先出的效果。
2023-09-16 21:20:24 26
原创 leetcode 刷题_day08_字符串02_KMP
kmp算法关键在于:在当前对文本串和模式串检索的过程中,若出现了不匹配,如何充分利用已经匹配的部分 --> 前缀表的建立和利用。
2023-09-15 20:35:20 32
原创 leetcode 刷题_day05_哈希表01_快速查值
判断两个字符串每个字符出现的次数是否都相同 --> 存储这两个字符串各个字母出现的次数并判断 -->
2023-09-11 21:42:44 28
原创 leetcode 刷题_day04_链表02_最小单元交换操作&同向指针删除/比较&快慢指针处理环表
2. 找到两个链表可能的最长相交位置,也即短的链表的头节点。1.如果有相交的部分,则从末端到相交点一定是共用的,也即。3. 从这个节点开始,逐个节点对比。,基于这点,可以使用双指针法。同向双指针 & 快慢指针。
2023-09-10 19:11:05 89
原创 leetcode 刷题_day03_链表01_查找&删除&插入&双指针处理单链表
链表的删除操作和数组不同,数组是通过覆盖的方式实现(因为连续存储),而链表是通过指针重指的方式来删除(因为不连续存储)
2023-09-08 21:12:27 196
原创 leetcode 刷题_day02_数组02_滑动窗口&对向双指针&循环不变量
题目的核心是要获取一个符合条件的子数组,因此通过两个指针构建一个可以移动的,长度动态的窗口(滑动窗口),即可将问题拆解成。1 .数组循环问题中,必须在循环中对处理的数组设置区间不变量,也即:每次处理的数组区间应当是一致的。2. 在这个问题中,每次循环需要处理四条边,那每条边的区间应当设置成一样, 这里是设置成。每个元素最多被处理两遍,也即2n,因此时间复杂度为。双指针法遍历 + 尾插法构建新数组。
2023-09-07 22:18:17 250
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人