- 博客(46)
- 收藏
- 关注
原创 代码随想录二刷7.12|209.长度最小的子数组
我们可以将这个子数组看成一个区间,暴力解法就是固定一端,然后另外一边不断的扩大,那如果我们可以同时控制两端,是不是可以达到减少时间呢?当我这个区间的和大于目标,那么就收缩左端,直至小于目标值,然后,右端直接扩大,右端到达数组边界时,便停止循环。像这种暴力解法就是穷举法,将所有的可能都枚举出来,在这过程中,将最小的长度找出来。但是暴力解法呢,是通过不了的,它超时了。
2024-07-12 23:52:33 214
原创 代码随想录二刷7.22|977.有序数组的平方
—从题目中找到的信息:这是一个非递减顺序的整数数组,从例子中,可以容易看出最大值都是在两端处找到,并且题目要求在将值放入新数组,所以用两端平方后比较,将更大的值放入新的数组中。——如果想暴力解决这个问题的话,可以像题目那样,先将每一个元素平方,然后再排序。
2024-07-12 22:44:51 412
原创 代码随想录二刷7.11|27. 移除元素
—当遇到目标值时,将后面的的覆盖前面的,一个for循环遍历数组元素 ,第二个for循环更新数组。通过一个快指针和慢指针在一个for循环下完成两个for循环的工作。
2024-07-12 00:04:16 212
原创 代码随想录二刷7.10|704. 二分查找
当边界变动值为中间值,当需要变动时,说明中间值不是目标值,所以中间值不可以被选择,所以当是左右都是闭区间时,右边界为nums[mid-1],反之为nums[mid]这道题目强调这是一个有序数组,并且没有重复元素,这都是二分法使用的前提条件(如果有重复元素,可能用二分法找到的下标不是唯一。有两种区间,一种是左闭右闭区间,还有一种是左闭右开区间。——区间的选择其实是对右边界的选择有影响。还是没有搞清楚区间的影响。
2024-07-10 23:27:19 279
原创 web学习
访问: console.log(arr[ ])(在控制台显示)substring中是含头不含尾 意思就是结束索引要加一。confirm 有返回值 ture和false。parseInr 将其他类型转化成数字。NaN 是指违背定义的数字。json中必须要用双引号。没有声明的话,会报错。
2024-04-23 19:03:12 230 1
原创 代码随想录day43|1049. 最后一块石头的重量 II 、494. 目标和 、474.一和零
直接带入计算,在数组[0]中, x=(target+sum)/2,那么x=0,那么dp[0]=1,因为零的的前面不管是什么符号,都是一样的意义,所以说,填满容量为0的背包,都有一种情况。所以递推公式:dp[i][j] = max(dp[i][j], dp[i - zeroNum][j - oneNum] + 1);递推公式:dp[j] = max(dp[j],dp[j-stones[j]]+stones[j]]dp[i][j] 就可以是 dp[i - zeroNum][j - oneNum] + 1。
2024-04-15 19:51:07 467
原创 web学习
高度和宽度单位:px:表示像素 (一般情况下只写一个,另外一个等比例变化)%:相对于父元素的百分比。2.绝对网络路径:(必须保证有网络,而且这张图片必须网上存在)boeder :边框的宽度 cellspacing单光格之间的空白。../:上一级目录(不可省略)./:当前目录(可以省略)<img>:图像 src 表示属性 表示地址时用/<meta charset="UTF-8"> 字符集。DOCTYPE html> 文档类型。表单项中必须有name属性才可以提交。HTML属性值单双引号都可以。
2024-04-10 19:14:13 549
原创 代码随想录day42|背包问题、416. 分割等和子集
所以递归公式: dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);其他的位置的话,其实初始什么数值都是可以的,因为dp[i][j]是由左上方和正上方决定的,其他的位置都是会被覆盖的,初始化成零的话,更方便一点。dp[j]表示:容量为j的背包,所背的物品价值可以最大为dp[j],那么dp[0]就应该是0,因为背包容量为0所背的物品的最大价值就是0。第i件物品的重量是weight[i],得到的价值是value[i]。
2024-04-08 19:45:04 948
原创 代码随想录day41| 343. 整数拆分 、96.不同的二叉搜索树
递推公式:dp[i]+=dp[j-1]*dp[i-j];初始化:dp[0] = 1,dp[1] =1因为根结点为0或1是所有二叉树的种类之一,其余都要初始化为零,因为要不断的累加,所以说要从零开始累加。——这其实是在不断更新dp[i]的值,不放进的话,原本的dp[i]会直接被舍弃。初始化:dp[0]和dp[1]都是没有意义的,所以初始化为零,dp[2]=1。dp[i]:对i进行拆分,相乘得到的最大值dp[i]dp[i]:输入i时, 有dp[i]种情况。为什么还要dp[i[放进去比较?遍历顺序:从前向向后。
2024-04-02 20:24:57 322
原创 代码随想录day39| 62.不同路径 ,63. 不同路径 II
递推公式:没有路障的时候 dp[i][j] = dp[i-1][j]+dp[i][j-1] ——因为题目中要求是只可以向下或者向左。递推公式:dp[i][j] = dp[i-1][j]+dp[i][j-1] ——因为题目中要求是只可以向下或者向左。初始化:dp[i][0]和dp[0] 都是为1——因为只可以向下或者向左走,这两边只能直走。初始化:两边上遇到障碍后变成初始化零,在其前面初始化为1。dp[i][j]:到达这个数组不同路径和。dp[i][j]:到达这个数组不同路径和。
2024-04-02 18:58:54 284
原创 代码随想录day38| 509. 斐波那契数 、70. 爬楼梯 、746. 使用最小花费爬楼梯
递推公式:dp[i-2]+dp[i-1]——因为有两种方法可以上楼梯,所以第上第i阶时应该是走到第i-2阶的方法加上第i-1阶的方法。递归公式:dp[i] = fmin(dp[i-1] + cost[i-1], dp[i-2] +cost[1-2])初始化:dp[0] = dp[1] = 0 ——可以选择从下标为。dp数组的初始化:dp[0] = 0,dp[1]=1。dp数组的初始化:dp[0] = 0,dp[1]=1。递推公式:等于dp[i-2]+dp[i-1]dp[i]到达第i阶有dp[i]种方法。
2024-04-01 20:13:26 241
原创 代码随想录37| 738.单调递增的数字 、贪心算法总结
这道题其实就是看给出的数字的各个位上的数字是否为递增的,如果为递增,就直接不变,不是的话,就输出比它小的最大递增数字(其实就是最大位减一,然后其余位变成9)贪心算法没有套路可以讲,更多是看人对问题的思考,这里其实通过大量题目练习后,然后找到了了一种思路,我觉得贪心算法就是解决方法中比较巧妙的解题方法。——不行,假如1000的话,直接修改的话会是900,因为条件中不包含等于,但这不是最大的。为什么会有flag这个量出现?
2024-03-28 20:50:03 201
原创 代码随想录day36| 435. 无重叠区间 、 763.划分字母区间 、56. 合并区间
错误:没有正确的认识到这个hash这记录的是位置,不是距离,要用 end - start + 1;重叠区间其实代码都是相类似的,判断条件都大体不差,有区别的是要进行什么样的操作。这道题其实和用最小数量箭引爆气球一样,代码差不多,都是求重叠区间的量。局部最优:就时找这个区间字母中的最远位置,如何找到这个最远的位置?——可以用哈希表来记录。
2024-03-28 20:03:46 263
原创 代码随想录day35|860.柠檬水找零 、406.根据身高重建队列 、 452. 用最少数量的箭引爆气球
—就是二十块找零,有两种策略,第一种是一张十块,一张五块,第二种是三张五块,因为五块的可使用率更高,所以说局部最优是第一种策略,然后再到第二种。——要每个重叠的气球两两互相重叠,才可以用一个箭引爆气球,所以每次将重叠的气球中的最小右孩子记录下来。这里和分饼干一样,要进行分开贪心,是先对身高h进行排序,然后再对前面的人数k进行排序。因为身高是按照从大到小排序,因为动的数字是后面的数字,一定比前面小的。——其实是看返回值,如果返回值为正数,那么要进行交换位置,否则反之。如何理解重叠和这部分该如何处理?
2024-03-27 20:03:34 267
原创 代码随想录day34| 1005.K次取反后最大化的数组和、 134. 加油站 、 135. 分发糖果
局部最优是将绝对值最小的数进行反转,然后将所有的数加起来。因为题目要求,评分高的要比评分低的糖果要多。1,右孩子比左孩子大——从前向后遍历。2,左孩子比右孩子大——从后向前遍历。思路:左右两边不可以一起讨论,——为什么要从后向前遍历?
2024-03-26 19:33:06 271
原创 代码随想录day32| 122.买卖股票的最佳时机II 、 55. 跳跃游戏 、 45.跳跃游戏II
这道题和跳跃1相类似,也是覆盖范围来决定的,当覆盖还不到最后的时候,步数加加。解题思路:就是将每天的利润都算出来,只要是正的就加加。
2024-03-26 08:43:58 237
原创 代码随想录day31|455.分发饼干 、376. 摆动序列 、53. 最大子序和
当我的连续和为负数的时候,那么再继续加下去,也没有用,会使得值变小,所以要舍弃前面的,从当前位置重新来,然后题目中提及到删除,但是我们并不需要真的去删除,我们只需要将出现坡峰的值记录下来就好了。这道题可以将抽象一张图,条件就是有坡峰。第二种:只有首尾只有两个元素。第一种:上下坡中有平坡。第三种:单调坡中有平坡。
2024-03-25 20:36:49 315
原创 代码随想录day30|回溯总结
回溯算法就是一种暴力搜索法,就所有的情况都枚举出来。可以将这道题图像化,将它变一颗树。如何解决回溯算法这个问题。然后在判断结果是什么。
2024-03-24 19:41:48 252
原创 代码随想录day29|491.递增子序列 、46.全排列 、47.全排列 II
例如:4767 排完序后就是 4677了,其中有个结果是4677,但是这并不是4767的结果。——根据给出例题中,可以看出,我们是不可以进行排序的,因为一旦排序了, 就会产生多的答案。和前面的题的区别不大。
2024-03-21 20:46:28 204
原创 代码随想录day28| 93.复原IP地址、 78.子集、 90.子集II
这道题目其实和前面的题目上没有本质上差别,这里依旧是切割字符串,这里还进行判断和加点的行为。——因为终止条件是pathTop>numsSize,如果写在了它的下面会有结果被忽略了。这里为什么要将收集结果的条件写在终止条件的上面。
2024-03-20 20:39:53 271
原创 代码随想录day27| 39. 组合总和 、 40.组合总和II 、 131.分割回文串
这道题的和上一道题不同的地方是:要进行去重操作,一旦涉及到去重,那么就要对数组进行排序,然后这道题目的去重,去的是相同的结果,而不是去相同的元素,就是对树层进行去重。这道题和前几道题没有什么太大的区别,唯一的区别就是,元素是可以重复使用的。这里先将进行切割,切割成多个字符串,然后再进行判断是否为回文串。startindex其实是一条切割线。递归终止条件是什么?
2024-03-18 21:14:05 343
原创 代码随想录day25| 216.组合总和III 、 17.电话号码的字母组合
其实这个大体和组合这个问题差不多,这里其实将一个完整的数组分成了不同的数组,然后根据题目的要求,选择出相应的数组。这里的难点就是如何有字符串和如何将数字与字符链接起来,变成一个数组。
2024-03-17 21:13:34 212
原创 代码随想录day23| 669. 修剪二叉搜索树 、 108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树
思路:这道题删除二叉树中的树值很类似,但是我们不能直接将它的子结点返回,而是要对它的子结点进行修剪后才可以返回。
2024-03-15 20:19:48 188
原创 代码随想录day22|235. 二叉搜索树的最近公共祖先 、 701.二叉搜索树中的插入操作 、450.删除二叉搜索树中的节点
根据二叉搜查树的特点,我们可以将情况分成三种,第一种是两个值在分别在左右子树上,第二和三情况是两个值都在左子树或者右子树上。如果左右不为空,那么找要被删除结点的右子结点的最左子结点,然后将删除的左子结点放到最左子结点的左节点。有五种情况第一种为空树,第二种为树叶结点,第三四种,其中一个子结点为空,第五种左右结点都不为空。——因为不满足这两种情况的话,那一定就属于第一情况,题目中说到一个结点也是它本身的公共祖先。如果其中一个子结点为空的话,那么返回他的结点。如果为空树和树叶结点的话,那么直接返回空。
2024-03-15 18:57:17 169
原创 代码随想录day20| 654.最大二叉树 、 617.合并二叉树 、 700.二叉搜索树中的搜索 、 98.验证二叉搜索树
解题思路:比较时候不能只看当前子树是否满足搜查二叉树,因为逆这个子树满足了,不代表着正课二叉是满足搜查二叉树的。——返回另外一个树的子结点,不是子结点的值,因为两个树是一起操作做的。——没有想起二叉搜索树是已经排序了的。构造二叉树要用前序遍历。
2024-03-14 20:05:29 300 1
原创 代码随想录day21| 530.二叉搜索树的最小绝对差 、501.二叉搜索树中的众数 、 236. 二叉树的最近公共祖先
因为二叉搜查树是一个有序的,所以可以将存入一个数组里面,然后我们不断去对比。
2024-03-14 19:53:35 300 1
原创 代码随想录day18| 找树左下角的值 、 路径总和 、 从中序与后序遍历序列构造二叉树
—由于后序,所以说该数组的最后一个是父结点,然后再从中序中,找到左右子树,找到后,就不断分割数组;先在后序数组中将根结点找出,然后在中序数组中以根结点位置,左右分割两个数组,左为左子树,右为右子树。题目给了两个数组,一个是后序,一个是中序,——停止条件是当中序数组的长度为零的时候,后续和中序数组的作用。
2024-03-12 20:21:48 271 1
原创 代码随想录day17| 110.平衡二叉树、 257. 二叉树的所有路径、 404.左叶子之和
为什么判断父结点的情况,而不是子结点的情况,因为遍历到子结点的的时候,不知道遍历到的是左结点还是右结点,所以就要用到判断条件就是父结点的左结点的左右结点为空的时候。——用后续遍历的原因其实是单层遍历如何写,这道题目中我们是,先处理了左结点,然后到右结点,最后才到父节点的。——一开始没有认真看题目,题目的要求是从根结点到根的所有路径, 所以我们遍历到最后面就要开始返回了。——因为栈是先进后出的原因,保证了路线不会错乱。思路:求高度用后续遍历,深度用后续遍历,——当前遍历的子结点左右指针都是空的。
2024-03-11 20:32:48 304
原创 代码随想录day16|104.二叉树的最大深度、 111.二叉树的最小深度 、 222.完全二叉树的节点个数
【代码】代码随想录day16|104.二叉树的最大深度、 111.二叉树的最小深度 、 222.完全二叉树的节点个数。
2024-03-10 20:26:16 191 1
原创 代码随想录day15|二叉树层序遍历、 226.翻转二叉树、101. 对称二叉树
代码实现思路:先检查二叉树是否为空,然后初始化数组以及分配内存,然后就左结点入队然后到右结点入队。——要先比较左右两个子结点的情况,然后再比较父结点的情况。这里其实就是在一个数组里面实现两个元素互换。为什么要用到后序遍历。
2024-03-09 20:16:10 185
原创 代码随想录day14|144. 二叉树的前序遍历、145. 二叉树的后序遍历、94.二叉树的中序遍历
前序(因为是处理父结点,所以指针一直指向左边,到了尽头了,再返回处理)二叉树的前后中遍历顺序:其实是父节点处理的顺序,——例如:前序遍历就是父结点然后左到右。
2024-03-07 22:08:53 251 1
原创 代码随想录day12| 239. 滑动窗口最大值、 347.前 K 个高频元素
实现思路:用一个单调队列实现,单调队列出口是存放每个窗口的最大值,每结束一次窗口,就pop出出口元素,放入放回数组中,
2024-03-06 20:44:58 816 1
原创 代码随想录day11| 20. 有效的括号 、 1047. 删除字符串中的所有相邻重复项 、 150. 逆波兰表达式求值
—这里其实已经隐藏了删除的操作,假如说前面的没有重复的元素,那么由于后加加的操作,只会将原本的元素复制,假如前面是有出现的重复的元素,那么新的元素就给旧的覆盖,然后实现删除的操作。——因为代码中使用了后加加的操作,所以说stackTop其实是指向了下一位元素了。为什么要写 char letter = s[slow] = s[fast++];这道题可以看作是移除元素的题目,与数组不一样的地方是字符串以'\0'结尾的,——栈的长度为零了,还有字符串中右方向括号还没有遍历完。——字符与栈顶元素不匹配。
2024-03-05 21:12:17 303
原创 代码随想录day10|232.用栈实现队列 、225. 用队列实现栈
【代码】代码随想录day10|232.用栈实现队列 、225. 用队列实现栈。
2024-03-03 19:28:25 200 1
原创 代码随想录09|kmp算法
—因为第一个指针不动,第二个指针是取第一个指针前一个的最长相等前后缀第二个指针的起始位置,这个长度实际是指第二个指针在模式串跳过多少个元素后进行比较,因为是相等前后缀的原因,所以说,这跳过的x个元素,必定会和第一指针前的x个元素相等。——一个指针是文本字符串的,另外一个是模式字符串的,而暴力解法中呢,就是第一个指针不是一直往前走,而是遇到不同的时候,两个指针都往回跳,——我们需要一个前缀表来记录,每一个字符串的最长相等前后缀(的长度)是多少,我们要看不相同元素的前一个元素的最长相等前后缀是多少,
2024-03-02 18:28:37 291
原创 代码随想录day08Ⅰ344.反转字符串、541.反转字符串II、卡码网:54.替换数字、 151.翻转字符串里的单词 、卡码网:55.右旋转字符串
—i+k其实是要进行翻转的字符串,所以说i+k超过了长度,说明了剩余的字符串符合第一种情况。为什么是k = i + k > len?——因为第i位是操作字符串的开始,所以说要减去一。思路:每次处理2k段字符串。为什么right中要-1。
2024-03-01 23:43:12 195 1
原创 代码随想录day07| 454.四数相加II、 383. 赎金信 、 15. 三数之和 、 18. 四数之和
—因为数组内的元素范围很大,所以不可以将将元素映射到数组里面,数组的大小难以确定,并且会浪费大量的内存,然后不仅要储存元素,还要储存出现的次数,所以选择使用map,而不使用set,思路:和有效字母异位的解题大体一样,但是,这道题是将两个数组都变成哈希表,然后才进行比较他们的值,如果ransomNote大于magazine,那么就返回false,——前者是向前检查是否有重复,而后者相反,题目要求的是没有重复的三元组,但是里面的元素是可以相同的,所以如果是向后去重的话,那么就有些情况被删去了。
2024-02-28 15:08:30 644
原创 代码随想录day06|242.有效的字母异位词 349. 两个数组的交集、202. 快乐数 、 1. 两数之和
思路二:用双指针,为什么可以用双指针,因为可以将每一次的sum放入链表中,如果是是循环的化,那么就会形成环链,在链表中,学习到了如何找一个环链的入口,所以说这道题可以通过双指针的方法来解决。先将一个数组变成哈希表,然后将另外一个映射到哈希表上,如果哈希表上有这个,那么就将它移动出来,到新的数组内。思路1:要将每一次的结果给记录下来,当有结果再次重复的时候,说明是循环的了,所以用到哈希表。
2024-02-26 23:16:50 569 1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人