自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(42)
  • 收藏
  • 关注

原创 day 52 使用最小花费爬楼梯

意思是 跳到下标0或者下标1是不花费体力的,从下标0,下标1开始跳就要花费体力了。dp[i] : 到达第i台阶所花费的最少体力为dp[i]你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。cost[0] 从第0个台阶开始往上跳所要花的费用。dp[0] 到达第0个台阶花费的最少费用 0。因为可以选择从0 或 1 台阶开始爬 说明。看不懂题意,不知道该如何下手。两个途径到dp[i]

2023-04-21 19:42:20 82

原创 day51爬楼梯

所以第三层的状态可以由第二层楼梯和第一层楼梯状态推导出来。dp[i] 爬到第i层楼梯,有dp[i]种方法。dp[i-1]跨一步,dp[i-2]跨2步。第三层:从第一层爬2步,从第二层爬1步。dp[i] 到达第i阶的方法。dp[i]有两个方向可以推出。爬到第一层楼 有一种方法,由前一个状态导出,动规。

2023-04-20 22:27:29 359

原创 day50

如果某一问题有很多重叠子问题,使用动态规划是最有效的。所以动态规划中每一个状态一定是由上一个状态推导出来的,贪心没有状态推导,而是从局部直接选最优的。大家知道动规是由前一个状态推导出来的,而贪心是局部直接选最优的,对于大家刷题而言够用了。

2023-04-19 20:21:46 285

原创 day49 01背包一维数组||一和0

1 确定dp数组的定义,dp[j]表示:容量为j的背包,所背的物品价值可以最大为dp[j]遍历背包的顺序是和二维dp中的不一样。倒叙遍历是为了保证物品i只被放入一次。

2023-04-18 20:33:51 60

原创 day48 最后一块石头的重量||目标和||一和0

01背包的应用。

2023-04-17 19:45:04 30

原创 day46 背包问题||分割等和子集

放物品i: dp[i][j] = dp[i-1][j-weight[i]]+value[i]dp[i][j] 表示从下标为0-i的物品里任意取,放进容量为j的背包,价值总和最大是多少。不放物品i: dp[i][j] = dp[i-1][j]是01背包稍作变化而来,物品数量是无限的。有两个方向推出来dp[i][j]1 确定dp数组及下标的含义。

2023-04-15 19:32:56 34

原创 day 45 整数拆分|| 不同的二叉搜索树

dp[3],就是 元素1为头结点搜索树的数量 + 元素2为头结点搜索树的数量 + 元素3为头结点搜索树的数量。dp[i]:1 到 i 为节点组成的二叉搜索树的个数为dp[i]dp[i]:分拆数字i 可以得到的最大乘积为dp[i]dp[i] 最大乘积是怎么得到的 可以从1遍历j。当1为头节点时 右有2个节点 布局和n=2时一样。确定dp数组 及 下标的含义。1 确定dp数组以及下标的含义。

2023-04-14 22:31:56 46

原创 day44 不同路径 || 不同路径2

确定dp数组以及下标的含义。有障碍时 递推公式有点区别。

2023-04-13 19:06:55 25

原创 day38 动态规划|| 斐波那契数

所以动态规划中每一个状态是由上一个状态推导出来的,这一点就区分于贪心,贪心没有推导。动态规划 DP 如果某一问题有很多重叠子问题,使用动态规划是最有效的。1 确定dp数组(dp table) 以及下标的含义。2 确定递推公式(状态转移公式)而是直接从局部选最优的。3 dp数组如何初始化。动态规划问题 五部曲。5 举例推导dp数组。

2023-04-07 20:15:47 29

原创 day37 单调递增的数字

98 一但出现 strNum[i-1] > strNum(非单调递增) 首先让 strNum[i-1]--,然后strNum[i] 赋值为9。+str(数字字符串) 可以转为number型。从后向前遍历,可以重复利用上次比较得出的结果。89 即小于98的最大的单调递增整数。

2023-04-06 20:21:12 30

原创 day36 无重叠区间||划分字母区间||合并区间

按照右边界排序 从左向右记录非交叉区间的个数。最后用区间总数减去非交叉区间的个数。

2023-04-05 21:38:34 33

原创 day35 柠檬水找零 || 根据身高重建队列 || 用最少数量的箭引爆气球

局部最优可推出全局最优,找不出反例,那就试试贪心。

2023-04-04 21:38:50 46

原创 day 34 K次取反后的最大数值||加油站||分发糖果

答案上的reduce不行!!

2023-04-03 21:49:17 25

原创 day32 买股票的最佳时机|| || 跳跃游戏 || 跳跃游戏||

相当于(prices[3] - prices[2]) + (prices[2] - prices[1]) + (prices[1] - prices[0])。如果移动下标到达了当前这一步的最大覆盖最远距离了,还没有到终点的话,那么就必须再走一步来增加覆盖范围,直到覆盖范围到了终点。假如第0天买入,第3天卖出,那么利润为:prices[3] - prices[0]。以最小的步数增加覆盖范围,覆盖范围一旦覆盖到了终点,得到的就是最小步数。局部最优:收集每天的正利润,全局最优:求得最大利润。

2023-04-01 23:06:02 28

原创 day31 贪心算法

贪心的本质是选择每一阶段的局部最优,从而达到全局最优。

2023-03-31 21:41:01 52

原创 day30 回溯法总结

回溯法的遍历过程都可以抽象成树形结构回溯三部曲void backtracking(参数){if(终止条件){存放结果;return;for(选择:本层集合中元素(树中节点孩子的数量就是集合的大小)){处理节点;backtracking(路径,选择列表);回溯,撤销处理结果组合问题用递归控制for循环嵌套的数量搜索的过程:for循环横向遍历,递归纵向遍历,回溯不断调整结果集优化回溯方法只有剪枝一种方法。

2023-03-30 21:12:24 38

原创 day29 递增子序列||全排列||全排列2

可以不加,startIndex 每次都会加1 并不会无限递增。使用used数组 记录path里有哪些元素使用了。一个元素不能重复使用,需要startIndex。加个去重就行 同样使用used数组。用数组做哈希,来去重。

2023-03-29 21:25:07 29

原创 day28 复原IP地址||子集|| 子集||

startIndex 是需要的,因为不能重复分割,记录下一层递归分割的起始位置。组合问题和分割问题都是收集树的叶子节点。path 里存储的字符串为4个。切割问题 可以看成组合问题。子集问题是找树的所有节点。

2023-03-28 21:59:28 29

原创 day27 组合总和

本题没有组合数量要求,仅仅是总和的限制,所以递归没有层数的限制,只要选取的元素总和超过target,就返回!本题没有数量要求,可以无限重复,但有总和的要求,间接的也是有个数的限制。数组排序 sort((a,b)=>a-b)去重麻烦 used数组。

2023-03-27 21:02:22 35

原创 day 26 回溯||组合 ||组合总和||| 电话号码的字母组合

回溯法也可以叫回溯搜索法,一种搜索的方式回溯是递归的副产品,只要有递归就会有回溯回溯的本质是穷举,穷举所有可能,然后选出我们想要的答案组合是不强调元素的顺序的,排列是强调元素顺序回溯法解决的问题可以抽象为树形结构。回溯法解决的都是在集合中递归查找子集,集合的大小就构成了树的宽度,递归的深度,构成树的深度。

2023-03-26 22:50:48 36

原创 day25 修剪二叉搜索树||将有序数组转换为二叉搜索树||把二叉搜索树转为累加树

其实数组构造二叉树,构造平衡树是自然而然的事情,因为大家默认都是从数组中间位置取值作为节点元素,一般不会随机取。遇到root.val<low root.val>high root = null 时 return nul。然而在【1,3】区间 在二叉搜索树中可不是单纯的节点3 和左孩子节点0 就决定的。构造二叉树 本质是寻找分割点 分割点作为当前节点,然后递归左区间和右区间。pre 记录当前遍历节点的前一个节点 方便做累加。看成一个数组 有序 从后到前的累加。还要考虑节点0的右子树。

2023-03-25 21:05:39 26

原创 day24 二叉搜索树的最近公共祖先||二叉树中低的插入操作||

if(root===null) return root//第一种情况 没有找到删除的节点,遍历到空节点就直接返回了。第5种情况 左右孩子都不为空 把要删除节点的左孩子放到删除节点的右子树的最左面节点的位置。第三种情况 左孩子为空 右孩子不为空 删除节点 右孩子补位 返回右孩子为根节点。本题就是标准的搜索一条边的写法,遇到递归函数的返回值,如果不为空,立刻返回。找到遍历的节点为null时,就是要插入节点的位置了,并把插入的节点返回。第四种情况 右孩子为空 左孩子不为空 左孩子补位 返回左孩子为根节点。

2023-03-24 20:52:18 20

原创 day23 二叉搜索树的最小绝对差||二叉搜索树中的众数||二叉树的最近公共祖先

最后对map进行遍历 如果频率等于最大频率,把元素加到结果集中。中序遍历 是有序的 可以把他们都放入一个数组 最后进行比较。接下来就看如何判断一个节点是节点q和节点p的公共祖先呢。则更新啊maxCount res数组清除。利用map来存储每个数以及出现的频率。如果count>maxCount。利用二叉搜索树的特性进行求解。

2023-03-23 22:02:02 51

原创 day 22 最大二叉树||合并二叉树||二叉搜索树中的搜索||验证二叉搜索树

终止条件 如果t1===null 合并就是t2 t2null 合并是t1。这就决定了,二叉搜索树,递归遍历和迭代遍历和普通二叉树都不一样。如果root为空 或者找到这个数值了 就返回root节点。要知道中序遍历下,输出的二叉搜索树节点的数值是有序序列。因为二叉搜索树的节点是有序的,所以可以有方向的去搜索。构造树 一般采用前序遍历,因为可以先构造中间节点。

2023-03-22 22:23:08 20

原创 day21 找树左下角的值||路径总和1、2||从中序与后序遍历序列构造二叉树

调用函数时,传count时 先把根节点的值减掉 count减去遍历路径上每个节点的值。以后序数组的最后一个元素为切割点,先切中序数组,根据中序数组,反过来切后序数组。递归函数有返回值,如果递归函数返回true,说明找到了合适的路径,应该立即返回。可以用递减,让计数器count初始为目标和,然后每次减去遍历路径节点上的数值。因为终止条件是判断叶子节点,所以递归的过程中就不要让空节点进入递归了。如果最后 遍历到了叶子节点 count===0 说明找到了目标和。在找最大深度的时候,递归的过程中依然要使用回溯。

2023-03-21 22:17:01 39

原创 day19 平衡二叉树||二叉树的所有路径||左叶子之和

/ curPath += node.val+'->'//隐藏回溯 因为在下面递归时 一个递归结束 上层的path不会受到影响。终止条件没有判断节点是否为空 ,那么这里递归时1,如果为空就不进行下一层递归了。递归的过程中遇到空节点为终止,返回0 表示当前节点为根节点的树高度为0。因为是前序遍历,需要先处理中间节点,中间节点就是我们要记录路径上的节点。本题找到叶子节点,就开始结束的处理逻辑了(不能到叶子节点才开始)只有当前遍历的节点是父节点,才能判断其子节点是不是做叶子。3 确定单层递归的逻辑。

2023-03-19 22:48:57 21

原创 day18 二叉树的最大深度||二叉树的最小深度||完全二叉树的节点个数

递归法后序遍历 求的是高度递归法 确定函数的参数和返回值 参数传入树的根节点 返回这个树的深度。确定终止条件 如果为空节点的话,返回0 表示高度为0确定单层递归的逻辑先求它的左子树的深度 再求右子树的深度,最后取左右深度最大的数值+1。

2023-03-18 23:37:48 27

原创 day 17 二叉树的层序遍历|| 翻转二叉树

/交换节点 不要只交换值。return true//左右没有 对称 左右都为空,对称,返回true。queue里面存放每一层的节点 每一层遍历完后 就让这层的节点出队列。层序遍历 即逐层的 从左到右访问所有节点。队列先进先出 符合一层一层遍历的逻辑。把二叉树的左右节点交换 不是交换值。把层序遍历的数组结果做一个翻转。用双指针法 用解构赋值交换数据。对称 判断根节点的左右子树。

2023-03-17 21:38:38 26

原创 day16 二叉树||二叉树的递归遍历||前中后序遍历

链式存储的二叉树节点的定义方式二叉树的定义 和链表是差不多的,相对于链表 ,二叉树的节点里多了一个指针, 有两个指针,指向左右孩子。

2023-03-16 20:46:14 34

原创 day15 滑动窗口最大值||前K个高频元素

如果push的数值大于入口元素的数值,那么就将队列后端的数值弹出 直到push的数值小于等于队列入口元素的数值为止 (保持单调递减)数组用shift() 方法。数组用pop() 方法。

2023-03-15 22:06:49 66

原创 day14 有效的括号||删除字符串中的所有相邻重复项

Math.floor(x) 中x可以使一个数值,也可以是一个表达式。js中 要拿到栈顶部元素 得pop 但是有可能不符合条件 那么你得重新push pop弹出的元素。//可以向下取整 -1!栈帮助我们记录了 遍历数组当前元素时,前一个元素是什么。| 符号 为二进制位 有一个为1 就都为1。栈里放的是遍历过的元素。

2023-03-14 22:30:41 22

原创 day13 栈和队列||用栈实现队列|用队列实现栈

栈提供push 和 pop 等等接口,所有元素必须符合先进后出规则,所以栈不提供走访功能,也不提供迭代器(iterator)。shift方法 把数组中第一个元素删除,并返回这个元素的值。pop() 删除数组最后一个元素 返回最后一个元素。但要把弹出的元素push进stackOut数组。不为空 则数组pop 弹出stack元素。q1剩下的一个元素就 就是要返回的值。使用数组的push pop 方法。push() 往数组末尾添加元素。要实现 的队列pop() 方法。复用实现队列的pop方法。

2023-03-13 21:54:08 58

原创 day 12 替换空格|反转字符串里的单词||左旋转字符串

思路%20 字符串 要占三个位置 替换空格 得额外增加2个位置JS中 先把字符串转换成数组定义两个指针left 指向 数组原长度的尾部 right 指向新数组的尾部对原数组进行遍历出现空格right-=2还得再-1 因为一次循环js有字符串。

2023-03-12 21:41:16 45

原创 day11 反转字符串||反转字符串2

定义两个指针 一个从字符串前面 一个从字符串后面 两个指针同时向中间移动 并交换元素。等号左右两边模式相同,就会将右边的值赋给左边的变量。join()方法 把数组中的元素放入一个字符串。split方法 把字符串 分割成字符串数组。利用ES6的解构赋值更加简洁的进行元素交换。一定要注意写分号,否则解构赋值代码会报错。状态不好时 没看明白(题都没注意看)注意遍历时 对左半侧进行遍历就行。size=数组长度/2 注意取整。

2023-03-11 21:29:48 27

原创 day10 四数之和II |赎金信|三数之和|四数之和

四数之和II 赎金信 三数之和 四数之和

2023-03-10 14:24:36 89

原创 day9 哈希表 |有效的字母异位词|两个数组的交集|快乐数|两数之和

哈希表|有效的字母异位词|两个数的交集|快乐数

2023-03-09 19:43:21 53

原创 day 8 链表相交|环形链表2

链表相交|环形链表

2023-03-08 20:13:58 33

原创 day 7 翻转链表||两两交换链表中的节点||删除链表的倒数第n个节点

翻转链表 两两交换链表中的节点

2023-03-07 21:37:26 91

原创 day6 移除链表元素

移除链表元素||设计链表

2023-03-06 22:28:39 52

原创 day4 LeetCode209 长度最小的子数组 | LeetCode59 螺旋矩阵2

长度最小的子矩阵|螺旋矩阵

2023-03-05 23:33:29 37

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除