- 博客(57)
- 收藏
- 关注
原创 代码随想录算法训练营第三十五天|01背包问题 二维和一维(卡码网第46题)、416分割等和子集
因为一维dp的写法,背包容量一定是要倒序遍历(原因上面已经讲了),如果遍历背包容量放在上一层,那么每个dp[j]就只会放入一个物品,即:背包里只放入了一个物品。,那么dp[0]就应该是0,因为背包容量为0所背的物品的最大价值就是0。二维dp遍历的时候,背包容量是从小到大,而一维dp遍历的时候,背包是从大到小。此时dp[2]就已经是30了,意味着物品0,被放入了两次,所以不能正序遍历。为0,存放编号0的物品的时候,各个容量的背包所能存放的最大价值。应该是 0,因为背包容量比编号0的物品重量还小。
2024-12-27 00:39:43
936
原创 代码随想录算法训练营第三十四天|62不同路径、63不同路径 II
推出我们可以按照行从左至右遍历,其次”除第一行、第一列以外,其余所有格子的路径数由左边格子的值。推出我们可以按照行从左至右遍历,其次”除第一行、第一列以外,其余所有格子的路径数由左边格子的值。由于机器人的移动路径中不能包含任何有障碍物的方格,当我们遍历到当前有障碍的格子时将。“也可以发现按照一行一行遍历,下面的行也可以利用到之前行的结果。除第一行、第一列以外,其余所有格子的路径数由左边格子的值。除第一行、第一列以外,其余所有格子的路径数由左边格子的值。时才做for循环里的步骤。的路径数只能由左边格子的值。
2024-12-26 10:55:40
405
原创 代码随想录算法训练营第三十二天|509斐波那契数、70爬楼梯、746使用最小花费爬楼梯
也就是说到达第 0、1 个台阶是不花费的,但从第0、1个台阶往上跳的话,需要花费 cost[0]、cost[1]。数组打印出来看看和我们推导的数列是不是一致的。数组打印出来看看和我们推导的数列是不是一致的。数组打印出来看看和我们推导的数列是不是一致的。,那么遍历的顺序一定是从前到后遍历的。,那么遍历的顺序一定是从前到后遍历的。,那么遍历的顺序一定是从前到后遍历的。如果代码写出来,发现结果不对,就把。如果代码写出来,发现结果不对,就把。如果代码写出来,发现结果不对,就把。数组来保存递归的结果。
2024-12-24 15:57:44
303
原创 代码随想录算法训练营第三十一天|56合并区间、738单调递增的数字
为了保证调整后的数字仍然是单调递增,可能需要继续向左检查并调整前面的位。最后将字符串转换回整数并返回。按照每个区间的起点进行排序。来存储合并后的区间。
2024-12-24 13:23:36
224
原创 代码随想录算法训练营第三十天|452用最少数量的箭引爆气球、435无重叠区间、763划分字母区间
这个问题的核心是找到字符串中的片段,使得每个片段内的字符在其他片段中不会重复出现。这样可以优先选择结束时间较早的区间,给后续区间留出更多空间。这是因为尽量让箭在靠前的位置射出可以覆盖更多的气球。:被移除的区间数量即为总区间数减去最终的不重叠区间数。记录当前箭的位置,并统计箭的数量。:最终统计的箭数即为答案。:按照气球的结束坐标。:按照区间的结束坐标。
2024-12-23 22:07:14
279
原创 代码随想录算法训练营第二十九天|134加油站、135分发糖果、860柠檬水找零、406根据身高重建队列
如果还是不能理解为什么不能用candies[i] = candies[i + 1] + 1;在开始时,手头没有任何零钱,所以设置两个变量来记录当前拥有的 5 美元和 10 美元的数量,初始值为 0。如果遍历完所有顾客后,从未遇到找零失败的情况,则说明所有顾客的找零需求都被满足,返回成功。**公式:**candies[i]=candies[i−1]+1。如果当前孩子的评分更高,则需要保证他的糖果比左边的孩子多。如果当前孩子的评分更高,则需要保证他的糖果比右边的孩子多。当从左到右遍历时,判断的是。
2024-12-23 21:34:03
967
原创 代码随想录算法训练营第二十八天|122买卖股票的最佳时机II、55跳跃游戏、45跳跃游戏II、1005K次取反后最大化的数组和
在整个交易过程中,只需要关注每次有收益的交易(即后一天的价格比当天高的情况)。 如果最小值为正数,所有元素都为正,无法通过取反增加和。是偶数:取反操作相互抵消,不影响结果,直接计算数组和。是奇数:必须取反一次,因此取反最小的正数(即。如果数组最小值等于零,直接返回数组和。大于等于数组的最后一个位置,返回。次操作浪费在零上,不影响其他元素。因为零的取反对结果无影响,可以让。代码根据数组最小值的情况(即。(a) 如果最小值大于零 ((b) 如果最小值等于零 (© 如果最小值是负数 (
2024-12-19 23:21:50
352
原创 代码随想录算法训练营第二十七天|455分发饼干、376摆动序列、53最大子序和
先将饼干数组和小孩数组排序,然后从后向前遍历小孩数组,用大饼干优先满足胃口大的,并统计满足小孩数量。大尺寸的饼干既可以满足胃口大的孩子也可以满足胃口小的孩子,那么就应该优先满足胃口大的。为了满足更多的小孩,就不要造成饼干尺寸的浪费。
2024-12-19 20:05:18
509
原创 代码随想录算法训练营第二十五天|491非递减子序列 、46全排列、47全排列 II
因为排列问题,每次都要从头开始搜索,例如元素1在[1,2]中已经使用过了,但是在[2,1]中还要再使用一次1。而本题求自增子序列,是不能对原数组进行排序的,排完序的数组都是自增子序列了。**所以不能使用之前的去重逻辑!**因此使用set对本层元素进行去重。但在90子集II是通过排序,再加一个标记数组来达到去重的目的。最大的不同就是for循环里不用startIndex了。这又是子集,又是去重,看起来和90子集II很像。
2024-11-09 18:45:00
225
原创 代码随想录算法训练营第二十四天|93复原IP地址 、78子集、90子集II
这道题目和78子集区别就是集合里有重复元素了,而且求取的子集要去重。如果把 子集问题、组合问题、分割问题都抽象为一棵树的话,关于回溯算法中的去重问题,
2024-11-09 18:42:22
190
原创 代码随想录算法训练营第二十三天|39组合总和 、40组合总和II、131分割回文串
单层for循环依然是从startIndex开始,搜索candidates集合。关键点:不用i+1了,表示可以重复读取当前的数。如果是多个集合取组合,各个集合之间相互不影响,那么就不用startIndex,例如:17电话号码的字母组合。如果是一个集合来求组合的话,就需要startIndex,例如:77组合,216组合总和III。
2024-11-07 22:28:43
232
原创 代码随想录算法训练营第二十二天|回溯法模板、77组合 、216组合总和III、17电话号码的字母组合
【代码】代码随想录算法训练营第二十二天|回溯法模板、77组合 、216组合总和III、17电话号码的字母组合。
2024-11-07 22:24:35
348
原创 代码随想录算法训练营第二十一天|669修剪二叉搜索树 、108将有序数组转换为二叉搜索树、538把二叉搜索树转换为累加树
使用分治法的思想,将排序数组的中间元素作为根节点,以此构建二叉搜索树。由于数组是有序的,选择中间元素作为根可以确保树的平衡性。:每次递归完成后,返回当前构建的节点(根节点)。:如果当前节点是空节点,直接返回空节点即可。函数并传入整个数组的范围(0 到。:最终返回修剪好的子树根节点。
2024-11-04 21:16:02
423
原创 代码随想录算法训练营第二十天|235二叉搜索树的最近公共祖先、701二叉搜索树中的插入操作、450删除二叉搜索树中的节点
【代码】代码随想录算法训练营第二十天|235二叉搜索树的最近公共祖先、701二叉搜索树中的插入操作、450删除二叉搜索树中的节点。
2024-11-04 21:14:48
1695
原创 代码随想录算法训练营第十八天|530二叉搜索树的最小绝对差、501二叉搜索树中的众数、236二叉树的最近公共祖先
通过中序遍历将二叉搜索树转换成有序数组,然后遍历一遍数组,就统计出来最小差值了。函数按中序遍历二叉搜索树,将节点值从小到大顺序存入。
2024-11-02 00:43:33
488
原创 代码随想录算法训练营第十七天| 654最大二叉树、617合并二叉树、700二叉搜索树中的搜索、98验证二叉搜索树
因为是传入了两个树,那么就有两个树遍历的节点t1 和 t2,如果t1 == NULL 了,两个树合并就应该是 t2 了(如果t2也为NULL也无所谓,合并之后就是NULL)。单层递归的逻辑就比较好写了,这里我们重复利用一下t1这个树,t1就是合并之后树的根节点(就是修改了原来树的结构)。首先要合入两个二叉树,那么参数至少是要传入两个二叉树的根节点,返回值就是合并之后二叉树的根节点。t1 的右子树:是 合并 t1右子树 t2右子树之后的右子树。类型,用于返回找到的目标节点的指针,如果未找到则返回。
2024-11-02 00:39:06
592
原创 代码随想录算法训练营第十六天|513找树左下角的值、112路径总和、113路径总和II 、106从中序与后序遍历序列构造二叉树、105从前序与中序遍历序列构造二叉树
【代码】代码随想录算法训练营第十六天|513找树左下角的值、112路径总和、113路径总和II 、106从中序与后序遍历序列构造二叉树、105从前序与中序遍历序列构造二叉树。
2024-10-30 22:25:22
447
原创 代码随想录算法训练营第十五天|110平衡二叉树、257二叉树的所有路径 、404左叶子之和、222完全二叉树的节点个数
这样设计的原因是,一旦子树不平衡,后续的递归也没有必要继续判断,因此返回 -1 来直接传递不平衡的信息。要判断当前节点为根的子树是否平衡,关键在于左右子树高度差的绝对值是否超过 1。:在递归中,终止条件指的是在什么情况下可以直接返回结果,而不需要继续递归。的思想,它确保路径的正确性,避免混入多余节点。是否为空,因为在递归中已经确保了传入的节点不会是空节点。为 -1,表示左子树不平衡,直接返回 -1。为 -1,表示右子树不平衡,直接返回 -1。否则,返回以当前节点为根的子树的高度,即。
2024-10-30 11:30:23
727
原创 代码随想录算法训练营第十四天|226翻转二叉树、 101对称二叉树、104二叉树的最大深度、111二叉树的最小深度
【代码】代码随想录算法训练营第十四天|226翻转二叉树、 101对称二叉树、104二叉树的最大深度、111二叉树的最小深度。
2024-10-29 21:40:07
197
原创 代码随想录算法训练营第十三天|二叉树的递归遍历、 二叉树的迭代遍历、二叉树的层次遍历
因为题中结果带有小数点,所以基于层次遍历框架代码,首先需要将数组和数据的类型定义为double,其次定义double sum记录每一层节点的和,在for循环结束后将sum/size求一层节点的平均值。写完了递归算法, 运行的时候,经常会遇到栈溢出的错误,就是没写终止条件或者终止条件写的不对,操作系统也是用一个栈的结构来保存每一层递归的信息,如果递归没有终止,操作系统的内存栈必然就会溢出。基于层次遍历框架代码,在单层遍历的时候记录一下本层的头部节点,然后在遍历的时候让前一个节点指向本节点就可以了。
2024-10-29 00:31:34
863
原创 代码随想录算法训练营第十一天|150逆波兰表达式求值、239滑动窗口最大值、347前 K 个高频元素
的情况下找出出现频率前 k 高的元素,可以考虑使用哈希表和小顶堆。中的元素按递减顺序排列,这样可以快速得到窗口中的最大值(在。这样保证了队列里最大值在前面。:O(n),每个元素最多只入队和出队一次。:O(k),用于存储窗口的双端队列。窗口滑动过程中得到的最大值序列是。来存储数组的索引,并保证。再也不会成为最大值了(被。是当前窗口的最大值)为了在时间复杂度优于。
2024-10-27 23:47:34
921
原创 代码随想录算法训练营第十天|232用栈实现队列、225用队列实现栈、20有效的括号、1047删除字符串中的所有相邻重复项
遇到重复字符时从栈中移除,确保栈中无相邻重复字符。:用来存储字符,帮助判断和移除相邻的重复字符。(顺序是反的),然后将。
2024-10-27 21:08:49
296
原创 代码随想录算法训练营第九天|151翻转字符串里的单词、卡码网:55右旋转字符串、28实现 strStr()、459重复的子字符串
那么既然前面有相同的子串,后面有相同的子串,用 s + s,这样组成的字符串中,后面的子串做前串,前面的子串做后串,就一定还能组成一个s。当一个字符串s:abcabc,内部由重复的子串组成,那么这个字符串的结构一定是这样的:就是由前后相同的子串组成。当然,我们在判断 s + s 拼接的字符串里是否出现一个s的的时候,,这样避免在s+s中搜索出原来的s,我们要搜索的是中间拼接出来的s。举个例子,源字符串为:"the sky is blue "这样我们就完成了翻转字符串里的单词。(2) KMP:经典思想就是。
2024-10-26 23:33:36
198
原创 代码随想录算法训练营第八天|344反转字符串、541反转字符串II、卡码网:54替换数字
对于字符串,我们定义两个指针(也可以说是索引下标),一个从字符串前面,一个从字符串后面,两个指针同时向中间移动,并交换元素。
2024-10-26 23:30:24
212
原创 代码随想录算法训练营第七天|454四数相加II、 383赎金信、15三数之和、18四数之和
我们设想一下,我们当前的三数之和为 -3 < 0 那么我们如果移动橙色指针的话则会让我们的三数之和变的更小,因为我们的数组是有序的,所以我们移动橙色指针(蓝色不动)时和会变小,如果移动蓝色指针(橙色不动)的话,三数之和则会变大,所以这种情况则需要向右移动我们的蓝色指针,找到三数之和等于 0 的情况进行保存,如果三数之和大于 0 的话,则需要移动橙色指针,途中有三数之和为 0 的情况则保存。但是这里我们需要注意的一个细节就是,我们需要去除相同三元组的情况,我们看下面的例子。下面我们来看下三个指针的初始位置。
2024-10-24 23:02:43
1974
原创 代码随想录算法训练营第六天|242有效的字母异位词、349两个数组的交集、202快乐数、1两数之和
在遍历数组的时候,只需要向map去查询是否有和目前遍历元素匹配的数值,如果有,就找到的匹配对,如果没有,就把目前遍历的元素放进map中,因为map存放的就是我们访问过的元素。定义一个数组叫做num用来上记录字符串s里字符出现的次数,大小为26 就可以了,初始化为0,因为字符a到字符z的ASCII也是26个连续的数值。本题呢,我就需要一个集合来存放我们遍历过的元素,然后在遍历数组的时候去询问这个集合,某元素是否遍历过,也就是 是否出现在这个集合。我们不仅要知道元素有没有遍历过,还要知道这个元素对应的下标,
2024-10-22 21:47:50
977
原创 代码随想录算法训练营第四天|24两两交换链表中的节点、19删除链表的倒数第N个节点、160链表相交、142环形链表II
求出两个链表的长度,并求出两个链表长度的差值,然后让较长链表的指针移动到和另一个链表末尾对齐的位置,此时我们就可以比较curA和curB是否相同,如果不相同,同时向后移动curA和curB,如果遇到curA == curB,则找到交点。否则循环退出返回空指针。双指针的经典应用,新建一个虚拟头结点pre,令q=head,p=pre;如果要删除倒数第n个节点,让q移动n步,然后让p和q同时移动,直到q指向空,此时p指向删除结点的上一个结点。
2024-10-22 16:20:47
229
原创 代码随想录算法训练营第三天|203移除链表元素、707设计链表、206反转链表
为什么要保存一下这个节点呢,因为接下来要改变 cur->next 的指向了,将cur->next 指向pre ,此时已经反转了第一个节点了。最后,cur 指针已经指向了null,循环结束,链表也反转完毕了。移除头结点和移除其他节点的操作是不一样的,因为链表的其他节点都是通过前一个节点来移除当前节点,而头结点没有前一个节点。然后就要开始反转了,首先要把 cur->next 节点用tmp指针保存一下,也就是保存一下这个节点。首先定义一个cur指针,指向头结点,再定义一个pre指针,初始化为null。
2024-10-21 23:04:38
265
原创 代码随想录算法训练营第二天|209长度最小的子数组、59螺旋矩阵II、卡码网58区间和、卡码网44开发商购买土地
窗口的起始位置如何移动:如果当前窗口的值大于等于target了,窗口就要向前移动了(也就是该缩小了)。C++ 代码 面对大量数据 读取 输出操作,最好用scanf 和 printf,耗时会小很多。窗口的结束位置如何移动:窗口的结束位置就是遍历数组的指针,也就是for循环里的索引r。前缀和方法解决,分别构建行和列两个前缀和向量。由外向内一圈一圈这么画下去。: 关键在于理解滑动窗口。
2024-10-18 22:26:58
246
原创 代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素、977、有序数组的平方
因此,可以使用两个指针,一个从数组的最左边开始,一个从最右边开始,比较两个指针指向数字的平方值,将较大的数放入结果数组中,并向中间移动指针。(3) 左开右闭:(1)(2)(4)的mid取值偏向中间偏左的元素,若mid同(1)(2)取值会陷入死循环,应取mid=l+(r-l+1)/2,使得mid取值偏向中间偏右的元素。,(l+r)/2和l+(r-l)/2的效果是相同的,为什么推荐用第二种写法呢?是为了防溢出,l+r存在溢出的问题,因此用l+(r-l)/2的写法更为标准。(1) 暴力解法:双重循环。
2024-10-17 22:34:53
300
1
原创 【慕课网】前端零基础入门---步骤五:让页面动起来的JS基础部分---10-JS BOM基础
10-JS BOM基础1 window对象(全局对象)2 window对象方法(alert-confirm-prompt)<!DOCTYPE html><html lang="en"><head> <title>3</title> <meta charset="utf-8"></head>...
2020-02-29 22:14:46
569
原创 【慕课网】前端零基础入门---步骤五:让页面动起来的JS基础部分---09-JS事件
09-JS事件1 初识js事件2 事件定义(上)3 事件定义(下)4 事件解绑5 IE事件处理程序6 跨浏览器事件处理程序7 事件委托与事件冒泡(难点,多看几遍,多练习)8 Event对象属性与方法(难点,多看几遍,多练习)9 IE8中的Event对象属性与方法10 Event对象跨浏览器兼容性写法11 事件类型(一)12 事件类型(二)13 事件类型(...
2020-02-29 13:52:58
304
原创 【慕课网】前端零基础入门---步骤五:让页面动起来的JS基础部分---08-JS DOM事件
08-JS DOM事件1 HTML事件2 DOM0级事件3 事件类型(onload)4 事件类型(onfocus和onblur)5 事件类型(onchange)6 事件类型(onresize和onscroll)7 键盘事件
2020-02-26 20:42:11
189
原创 【慕课网】前端零基础入门---步骤五:让页面动起来的JS基础部分---04-JS内置对象
04-JS内置对象第1章 javaScript中内置对象介绍第2章 JavaScript对象之数组2-1 Array数组(1)2-2 Array数组(2)2-3 数组方法(push()-unshift()-pop()和shift())2-4数组方法(join和sort)2-5 数组方法(concat和slice)2-6 数组方法(splice)...
2020-02-24 20:04:40
257
原创 【慕课网】前端零基础入门---步骤五:让页面动起来的JS基础部分---03-JS函数
03-JS函数1-1 函数的定义和调用1-2 函数的返回值1-3 arguments1-4 求任意一组数的平均值
2020-02-23 20:51:35
166
原创 【慕课网】前端零基础入门---步骤五:让页面动起来的JS基础部分---02-JS流程控制语句
02-JS流程控制语句第1章 JavaScript分支语句1-1 if语句1-2 if语句的嵌套1-3 switch第2章 JavaScript循环语句2-1 for语句(最常用的循环)2-2 for嵌套(最常用的循环)2-3 while循环第3章 break及continue语句...
2020-02-23 20:18:13
191
原创 【慕课网】前端零基础入门---步骤五:让页面动起来的JS基础部分---01-JS语法
01-JS语法第1章 初识JavaScript第2章 JavaScript语法规则2-1 JavaScript语法+变量第3章 JavaScript数据类型3-1 JavaScript数据类型之undefined与null3-2 JavaScript数据类型之Number与isNaN3-3 JavaScript数据类型之数值转换第4章 JavaScri...
2020-02-23 18:39:55
442
原创 【慕课网】前端零基础入门---步骤四:升级页面化妆师CSS3---07-CSS3动画
07-CSS3动画第1章 animation属性详解1-1 animation-name1-2 animation-duration<!DOCTYPE html><html lang="en"><head> <title>3</title> <meta http-equiv="Content-Type" c...
2020-02-22 21:00:34
173
原创 【慕课网】前端零基础入门---步骤四:升级页面化妆师CSS3---06-CSS3过渡
06-CSS3过渡第1章 过渡的概念第2章 transition属性详解2-1 transition-property属性2-2 transition-duration属性2-3 transition-timing-function属性2-4 transition-delay属性第3章 transition综合实例3-1 transition简写...
2020-02-21 18:11:36
256
原创 【慕课网】前端零基础入门---步骤四:升级页面化妆师CSS3---05-CSS3转换
05-CSS3转换第1章 transform简介第2章 transform的2D转换2-1 rotate2-2 translate2-3 scale<!DOCTYPE html><html lang="en"><head> <title>3</title> <meta http-equ...
2020-02-21 10:21:12
237
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅