- 博客(30)
- 收藏
- 关注
原创 代码随想录第六十一天 单调栈part01 739.每日温度 496.下一个更大元素 I 503.下一个更大元素II
3)如果大于栈顶的元素,则弹出栈顶元素,然后可以计算出这个栈顶元素在多少个之后比它大的值,是当前元素坐标 - 栈顶元素,如果弹出后还有比栈顶元素大的,则继续计算。思路:把这个数组拼接成回转寿司的形式,然后去求相对应的弹出的 top 的数值,同样是利用单调栈的公式。:一维数组,想要寻找任一个元素的右边或者左边比第一个自己大或小的元素的位置;:如果要找右边比自己大的,需要维护一个单调递增的单调栈;:空间换时间,遍历的过程中需要用一个栈来记录右边第一个比当前元素高的元素;2)再用 num1去得到每个值对应的值。
2024-07-01 21:00:29
332
原创 代码随想录算法训练营第四十三天 动态规划 part05● 1049. 最后一块石头的重量 II ● 494. 目标和 ● 474.一和零
2) 递推公式如果取当前的数,x和y 为当前数的 所含 0 和 1 的个数,那子集的个数应该是 dp[i - x][j - y] + 1 要和当前 dp[i][j]来比。1) dp[j]的含义: dp[j]表示放容量为 j 的物品的方法;之前背包问题已经处理了几种问题 1)dp[j]装满容量j 的最大价值 2)能不能装满背包, 这是第三种,装满背包的方法有多少种?1) dp[i][j] dp[i][j]表示的含义是在有 i 个 0和 j 个 1 的情况下,子集的个数。注意点:1)dp 初始化;
2024-05-28 12:56:00
240
原创 代码随想录第四十二天 动态规划 Part4 ● 01背包问题,你该了解这些! ● 01背包问题,你该了解这些! 滚动数组 ● 416. 分割等和子集
1)含义:dp[i][j]表示从 0-i 的物品中任意取,放进容量为 j 的背包,最大的价值和;思路:dp可以由 dp[i][j]变成 dp[j],把 dp[i- 1] 拷贝到 dp [i]层,表达式完全可以是 dp[i][j] = max(dp[j], dp[j - weight[i]] + value[i]),;dp[0][j]> weight[0]的时候,也就是第一个物品能被放下的时候,最大值就取第一个物品的价值,因为每个物品只能放一次,所以之后的初始化的值也是这个第一个物品的价值。
2024-05-17 23:56:53
263
原创 前端手写练习题及概念加深
2)vote作为一个外部函数来返回了这个定义的函数,JS 函数形成闭包,闭包是由函数以及声明该函数的词法环境组合而成的,该环境包含了这个闭包创建时的任何局部变量,vote为返回函数的引用,返回函数维护了一个词法环境,所以 vote 被调用时,times 依然可用。1)在外部函数定义了一个 times 的变量,新生成的函数没有自己的变量,它可以访问外部函数的变量,词法作用域根据源代码中声明变量的位置来确定该变量在何处可用。这里await等待 promise 返回成功的值,然后再执行后面的函数。
2024-05-10 23:53:41
588
原创 代码随想录第四十一天 动态规划 Part3 ● 343. 整数拆分 ● 96.不同的二叉搜索树
那么会有两种情况,一种是拆分两次即得到了最大乘积:i * (j-i), 一种是拆分三次及以上会得到最大乘积:及 j * dp[i - j] 这里不对 j 进行拆分是因为对 j 拆分的情况会在 dp[i-j]中已经包括了;如果头节点为 j 的话,那么左子树节点个数为 j - 1 个,因为左子树上节点的数值都小于头节点,右子树的节点的个数为 i- j, 因为右子树的节点的数值都大于头节点,那递推公式即为 dp[j] = dp[j- 1] + dp[i - j]96.不同的二叉搜索树。动态规划 Part3。
2024-05-10 22:30:53
162
原创 代码随想录第三十九天 DP Part2 62.不同路径 63. 不同路径 II
思路:这里遇到障碍物也就是 obstacles[i][j]=== 1的情况,就得跳过。63. 不同路径 II。动态规划 Part2。
2024-04-23 23:27:44
151
原创 代码随想录第三十八天动态规划part01● 理论基础 ● 509. 斐波那契数 ● 70. 爬楼梯 ● 746. 使用最小花费爬楼梯
动态规划part01。
2024-04-23 11:19:35
123
原创 代码随想录算法训练营第二十四天● 回溯算法理论基础 ● 77. 组合
(n, k, startIndex为三个必要的参数) 参数需要 n 为结尾的数字,k 为每个组合的数字的个数;然后还需要一个 startIndex, 因为组合的情况下,不能出现重复的数字,所以需要一个 startIndex来确定开始的位置;回溯算法的本质是穷举,穷举所有的可能,得到想要的答案;回溯算法可以抽象成树壮结构,集合的大小构成了树的宽度,递归的深度构成了树的深度。回溯适用于有很多重叠子问题的问题,包括组合问题、切割问题、子集问题、排列问题和棋盘问题;2. 回溯的适用问题?3.回溯算法的模板;
2024-04-14 21:32:23
238
原创 代码随想录第三十七天● 738.单调递增的数字 ● 968.监控二叉树 ● 总结
思路:从前到后或是从后到前都可以判断是否是单调递增的数字;但如何去获得比这个数字更小的递增数字呢?从前往后去遍历的话,如果当前位的数字需要-1,那可能又小于前一位了,所以需要从后往前去遍历。738.单调递增的数字。
2024-04-13 19:19:15
208
原创 代码随想录第三十六天 ● 435. 无重叠区间 ● 763.划分字母区间 ● 56. 合并区间
思路:依旧是求重叠区间的题, 这里有几个细节要注意,排序之后,startPoint 第一位一定是最小值,如果 startPoint是第一位或者最后一位,那么在循环中取不到,需要在最后在 push 进数组。看了卡哥的思路:首先要找到每个字母的最大边界,在不断找的过程中,会将其他字母也覆盖;获得这个最大边界的哈希表后,再遍历字符串,通过左右指针来确定终止的边界;如何判断这一群的开始和结束位置,让相同字母个数最多;思路和第三十五天最后一题差不多,这次是记录未重叠的点。● 435. 无重叠区间。
2024-04-13 09:20:50
106
原创 代码随想录第三十五天贪心 Part4 ● 860.柠檬水找零 ● 406.根据身高重建队列 ● 452. 用最少数量的箭引爆气球
思路:一定不要忽略找钱是有顺序的;10块一定找 5 块,20 一定找 10+5或 5*3 组合,需要找钱的时候,一定要找 5 块。思路: 首先对数组进行排序,判断出现重叠的数组的组合有多少个;判断重叠是数组的开始和结尾都在当前判断数据第一个数据左右。1) 先用 h 进行由高到低的排序;这里如果有相等的,那则需要 k 大的在前面;思路:k 表示前面有多少个人比当前高,那说明高的一定是排在前面的;2)根据 k 的值来插入并生成新的数组,splice 会改变原数组。406.根据身高重建队列。
2024-04-11 21:26:04
126
1
原创 代码随想录第三十四天 ● 1005.K次取反后最大化的数组和 ● 134. 加油站● 135. 分发糖果
开始如果简单判断第一个diff(gas -cost大于0就是起始点是有问题的,这里可能出现一正一负的情况;那就是需要判断出之前未出现过差值为负数的正数来作为第一个起始点,实现思路是,只要当前和出现了当前差值小于0的情况,就重置curSum和start的坐标点。如果简单的考虑,从该点往后走,如果数组和大于0,那就返回该起始点;这里还有几个细节,不要忽略0的情况,还有如果都是正数的话,那就只取最小的那个进行取反。第一次:局部最优:让绝对值最大的负数都变为正数;思路:从左边遍历,判断大的+1;
2024-04-09 22:31:05
176
原创 前端面试题之React篇(持续更新)
1.1 类组件需要用shouldComponentUpdate来判断某个属性是否变化来决定组件是否要重新渲染;函数组件会比较依赖状态来决定是否需要重新渲染组件;3)类组件在状态state改变时,可以只重新执行render函数(在state更新时,类组件会重新渲染组件,类组件是靠重新执行render函数来执行的)1. React类组件和函数组件的区别?2)类组件有自己的生命周期,在不同的生命周期完成不同的业务逻辑。1)类组件可以定义自己的state, 用来保存组件内部状态;b) useRef的使用场景。
2024-04-08 16:03:34
148
1
原创 代码随想录第十七天 110.平衡二叉树 、 257. 二叉树的所有路径 、 404.左叶子之和
思路:用递归明确三要素1)参数值为当前节点 2)递归的终止条件为a.当前节点为空则返回null b.如果左右子树之差大于1,则返回-1,如果返回值是-1,则终止递归 3)单层递归的逻辑:分别求出左右子树的高度,如果>1则返回-1,如果<1则返回当前最大高度;思路:还是用递归去解决,这里要注意终止条件是node为空的时候。这是练习二叉树部分第四天的内容。257. 二叉树的所有路径。
2024-04-07 17:31:21
153
原创 代码随想录第三十二天 122.买卖股票的最佳时机II ● 55. 跳跃游戏 ● 45.跳跃游戏II
思路:这里是求跳跃的最大覆盖范围,也就是遍历到当前元素的值,加上当前元素的索引(nums[i] + i);思路:遍历每一个元素,找到下一次更新的最大覆盖点;如果遍历到当前元素的坐标和当前的最大覆盖点相等的话,那跳跃次数就要更新了,当前的最大覆盖点也要更新为下次更新的最大覆盖点;我的思路:股票是可以每天买卖的,其实只要记录每天的正利润(局部最优解),求和即是最大利润(全局最优解)那么如果遍历到的当前元素的索引已经大于这个覆盖范围了,那么则无法到达最后一个元素。122.买卖股票的最佳时机II。
2024-04-06 18:31:03
268
1
原创 代码随想录第三十一天 贪心算法:理论基础 、 455.分发饼干 、376. 摆动序列 、53. 最大子序和
3)但是这样并没有通过所有测试用例,因为存在中间是平坡,且单调递增的序列,这样的其实如果也用 preDiff <= 0 且 curDiff > 0这个条件去判断的话,是会多增加一条,因为 preDiff是实时更新的,在中间是平坡时,preDiff 又更新为 0,那么又满足了preDiff <= 0 且 curDiff > 0这个条件,所以出现了多加一次的情况;卡哥思路是用局部最优去推导出全局最优,这里的局部最优是用最大的尺寸去满足最大的胃口,我感觉和双指针的思路其实类似;思路:将两个数组,胃口值。
2024-04-06 16:25:09
248
1
原创 代码随想录第十六天104.二叉树的最大深度 111.二叉树的最小深度、222.完全二叉树的节点个数
完全二叉树的特性是除了底层节点,上面的节点都是满的;那么可以根据这一特性去判断子节点是否是满二叉树,如果是满二叉树,那就可以用公式来求出子树的节点数;思路:这个之前也是使用过层序遍历来解决问题,这里要使用深度优先遍历来解决问题;思路:这个之前使用过层序遍历来解决问题,这里要使用深度优先遍历来解决问题。这是普通二叉树的节点求法,这里并不了解完全二叉树的求法会有什么区别。最大深度也就是求根节点到叶子节点的高度,这里用后序遍历。高度:任意一个节点到叶子节点的距离;深度:任意一个节点到根节点的距离 (前序)
2024-04-05 22:14:55
191
1
原创 代码随想录算法训练营第十五天:层序遍历10 道题 、226.翻转二叉树 101.对称二叉树 2
卡哥的递归方法: 前序和后序均可,中序遍历两次都需要递归左节点,因为如果中间节点交换放在中间的话,子节点已经交换过一次了,再递归右节点会存在一个节点没有被交换到。实现思路:限定当前层的数量的长度,进行遍历,并在此长度下,获取当前层的元素的集合暂存到层数组里,以及当前层的下一层的左右子节点。思路:这里我理解,判断子节点没有左节点和右节点时,即返回当前层序遍历的数组长度 + 1(+当前子节点的层数)该题是将二叉树的从右侧看到的节点都遍历出来,我的思路是取每层节点的最后一个节点,放入这个结果数组里;
2024-04-05 18:27:42
247
1
原创 代码随想录算法训练营第十四天 二叉树理论、递归遍历、迭代遍历和统一迭代
中序遍历: 将左节点全部弹出栈,再将左节点以此取出,查看是否有右节点,如果有的话,将右节点下的左节点全部弹入栈;统一迭代的核心是对处理过的节点后 push(null)入栈进行标记,如果 pop 出的是 null 节点,那么就要将前一个节点 pop 出并加入 result。若左子树节点不空,则左子树上所有节点的值均小于它的根节点的值;深度优先遍历:先遍历到深层次的子节点,再往回找节点,分为前序遍历,中序遍历和后序遍历;二叉树的迭代遍历是用栈来实现的,将元素不断压入栈中,根据先入后出的原则来遍历数组;
2024-04-05 15:15:48
124
1
原创 代码随想录算法训练营第九天 28. 实现 strStr() 459.重复的子字符串、字符串总结 、双指针回顾
不包含尾子母的所有子串,要求最长相等前后缀,前缀表是这个最长相等前后缀的数量的数组,跳到2的位置进行匹配,恰好是前缀表对应的数,遇见冲突的时候,要向前回退;: 如果遇到某位不匹配的时候,KMP 算法不是从头移动,而是跳到之前匹配的内容;双指针体现了效率的优势:替换空格,解决N数之和的问题, 用两个指针向中间逼近的方式,来解决在一个for循环下完成两个for循环的部分。1. 双指针法:用双指针法来进行移除操作、删除重复项等操作,这是处理字符串的常用方法。,太忙了暂时没时间看了,之后有空再看。
2024-04-01 18:04:02
122
原创 代码随想录算法训练营第十一天 20.有效的括号 1047. 删除字符串中的所有相邻重复项. 150. 逆波兰表达式求值
思路:首先要思考有哪些不匹配的场景,可能有以下场景:1)左括号多余了 2)右括号多余了 3)括号数量是双数,但是括号类型不匹配;这包括了括号不能交叉的情况;根据这三种情况;首先为了找到匹配的括号,可以设定相应的map;左括号为key,右括号为value,如果是key则弹入value,是value则弹出;题目链接:之前遇到移除重复项的题,是用双指针的方法实现的;即快指针找到需要填充的值,慢指针找到需要填充的索引;这里不是移除重复项;而是将两个连续重复项都删除;
2024-03-19 22:51:34
260
原创 代码随想录算法训练营第十天 理论基础、232.用栈实现队列、 225. 用队列实现栈
首先这里栈的定义是先进后出,那么相对应的方法是 push()和 pop(), 这里要用两个栈(入栈数组,出栈数组)来模队列的这个过程;队列, 首先栈的特性是先进后出,这道题上来还是有点懵的,这道题看起来是个基础题的考察,但是首先如何去定义一个栈就有点懵;即将最后一个元素弹出,但是现在是用队列模拟,只存在 shift 方法,那具体的实现步骤是。将元素压入栈顶:栈是先入后出的元素,栈顶元素即顺序先出的元素,那就是将元素压入数组末尾。太忙了,一个队列来实现的方法之后再看。1) 定义入栈和出栈两个数组。
2024-03-19 00:10:07
326
原创 代码随想录算法训练营第八天 344.反转字符串 541. 反转字符串II、卡码网:54.替换数字、151.翻转字符串里的单词、卡码网:55.右旋转字符串
这道题采用 1.去除多余空格 2. 反转整个字符串 3.反转单个单词的方式,将双指针方法又复习了一遍去除重复元素,这里结尾的逻辑要想清楚。这个先用循环的方式将数字替换,这个用到了ACM模式,先熟悉了ACM模式的代码,以下是JS(Node)的方式。这道题的思路就是用双指针法,从字符串两边不断移动左右两个指针,并进行交换;和上面的题思路类似,也是用双指针,区别是要注意边界条件。151.翻转字符串里的单词。太忙了暂时没空看了,有空再练习。卡码网:55.右旋转字符串。卡码网:54.替换数字。
2024-03-14 22:57:41
389
1
原创 代码随想录算法训练营第七天 454、两数相加 II、383. 赎金信 15.三数之和、18、四数之和
因为原数组里的值可能会有重复的,那么要进行判断 num[i] = num[i-1]的时候应该continue,因为i在前一个相等数的时候,已经把和为0的三个数给找到了,如果继续找,这个值就重复了;在移动 left 和 right时,也要进行去重,以免下一个值和当前值相等。用双指针法:先将数组排序,然后定义左指针(I+1)和右指针(nums.length -1) , 如果 num[I]和 num[left] 和 num[right]之和为 0, 那则找到了对应的三个数;和三数之和思路一致,多了一层循环。
2024-03-12 23:36:27
336
1
原创 代码随想录算法训练营第六天242.有效的字母异位词、349. 两个数组的交集、第202题. 快乐数、1. 两数之和、第202题. 快乐数
今天是哈希表练习的第一天:首先复习了哈希表的理论基础:哈希表是根据关键码的值直接进行访问的数据结构,,有数组,map和set这几种如果hashCode得到的数值大于tableSize,那么就要对数组进行一个取模操作,通过哈希函数来映射到哈希表的索引;如果发生了哈希碰撞(即两个名字都被链接到了同一个index, 那么需要用其他方法来解决问题 (拉链法和线性探索法)因为我们要使用额外的数组,set或者是map来存放数据,才能实现快速的查找。JS代码实现。
2024-03-11 23:09:48
330
原创 代码随想录算法训练营第四天 24. 两两交换链表中的节点、19.删除链表的倒数第N个节点、160.链表相交、142.环形链表II
今天是链表算法练习的第二天。
2024-03-09 17:56:35
374
原创 代码随想录算法训练营第三天 203.移除链表元素、707.设计链表、206.反转链表
使用虚拟节点的方式来遍历需要注意:1)要建立临时变量来遍历这个链表,不能用头节点进行遍历,如果用头节点进行遍历,头节点指向的值在不断的改变,最后无法返回原先的头节点 2)如果 current.next是要删的元素,那么不需要将 current 指向下一个节点,因为这时还是需要判断 current.next是否=== val。将 index-1 的节点的 next 指向需要添加的节点,需要添加的节点的 next 指向当前链表 index 对应的节点。1. 初始化 linkedList对象。
2024-03-08 23:16:44
427
原创 代码随想录算法训练营第二天977.有序数组的平方、209.长度最小的子数组、59.螺旋矩阵II
我的思路:采用一前一后两个指针的方式,滑动右指针,并且记录当前两数及两数之间和的大小,当这个和大于target的时候,去移动左指针,并计算更新的和,当这个和小于 target 时,再移动右指针,思路上和卡哥大差不差,实现上因为练习稍少,稍微遇到点问题;此处注意点: 循环的点(left
2024-03-07 23:07:17
503
1
原创 代码随想录算法训练营第一天|704. 二分查找、27. 移除元素
思路 2: 基于这是一个有序的数组,可以使用二分查找,首先定义出左边的变量和右边的变量,然后判断中位数和这个 target 的大小,不断缩小左边和右边数值的范围,然后最终确定和 target 相等的数值的索引;2. 写法为 while(left < right),当 num[mid] > target时, right更新为 middle(不变量本身就不包括 right,所以 right应该更新为 middle。思路: 暴力解法,遍历数组,如果发现当前位为 val,则将该位后面的元素集体往前移一位。
2024-03-06 23:56:45
688
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人