![](https://img-blog.csdnimg.cn/direct/764ef1d36c974cc59205cb327e4a9ff2.jpeg?x-oss-process=image/resize,m_fixed,h_224,w_224)
js算法日志
使用js核心语言逐个攻破算法练习题
乡村中医
这个作者很懒,什么都没留下…
展开
-
js单调栈
只要其小于栈顶就入栈,大于栈顶元素就把栈顶元素去除同时记录当前元素为栈顶元素的第一个大于元素。关于接雨水就有一点小难度,主要设计单调栈的进阶用法:那就是栈顶下第一个元素就是当前栈顶元素的左边第一个大于它的元素,这样就可以拿到左右两边的第一个最大。大不了就是把nums1元素在nums2中的下标记录下来,最后按最大温度的方式求,再把对应下标一个一个提出来(对就是这么暴力,没啥其他办法)nums1 中数字 x 的 下一个更大元素 是指 x 在 nums2 中对应位置 右侧 的 第一个 比 x 大的元素。原创 2024-01-28 16:40:05 · 436 阅读 · 0 评论 -
01背包问题的变式
本题其实就是尽量让石头分成重量相同的两堆,相撞之后剩下的石头最小,这样就化解成01背包问题了。首先就是该背包中的物品有且只有一项,也就意味着无法重复往背包里加同一个物品。本题个人认为是一道hard的题目,作为中等题应该是因为题意比较好懂。如何递推,根据题意的要求是求指定容量下组合方式数量,那就是累加。做着一类题最先需要找到的是最大容量是多少?dp数组的下标表示容量,值表示最终的重量。这一题的关键在于容量有两个但是并不难找。注意一些剪枝操作避免出现报错。left就是最后的容量。递推公式的关键是加一。原创 2024-01-10 17:02:23 · 382 阅读 · 0 评论 -
二维数组与滚动数组解决背包问题
优化:大家有注意到每次只是使用了上一层的数据,那么其实可以将矩阵压缩成一层,但是有个问题得注意,我们是一直在操作同一个数组,如果依旧是从头再来的话,后面的结果是没法参考上一层的数据,因为都被这一层给覆盖掉了。所以从后往前遍历时唯一解,毕竟参考的数据是前面,只要从后面来即可。关于背包问题及其变式是我们在面试中经常遇见的问题,同时背包问题也是常见的动态规划问题。解决这类问题通常是走一步看一步,即利用数组来记录上一步的结论,再与当前进行比较。原创 2024-01-09 22:01:38 · 375 阅读 · 0 评论 -
动态规划整数划分,不同的二叉搜索树
这两题均为典型的动态规划,通过dp数组前面的项得到当前项。不同于斐波拉契的是这两题的递推公式将不再是前几项简单的相加相乘。而不同的二叉搜索树是前面所有情况累加在一起,这跟上一题一样要变历前n项来进行递推操作。其中整数划分要求最大值,这就意味着要遍历前n项所以比起斐波拉契多了一个for循环。对于数组初始化通常视情况而定,一般是前一项或前两项。题号:整数划分343,不同的二叉搜索树96。即使无法知道是前几项,只多不少一定不会错。原创 2024-01-08 13:54:28 · 342 阅读 · 0 评论 -
javascript的力扣131.分割回文串
比如分割回文串,复原ip地址,子集问题。这一类题只需抓住path增加时不再是填加一个元素,而是数组再展开。在力扣中有一类组合问题的变式,它要求返回的果实不再是每一个树层都是一个,而是前面的和。原创 2023-12-27 15:13:41 · 344 阅读 · 0 评论 -
组合总和剪枝以及树层去重
首先组合总和1并不难,只需要牢记在for循环的外面控制的是树层的横向移动,而for循环内则控制的是树枝的纵向移动。那么接下来就来详细分析如何控制,第一所有回溯问题都可以抽象为一课树结构,那么分析本题可知节点都有可能为“果实”。纵向移动使用for循环以及回溯,注意若sum大于则没必要再往下移动。本文分析力扣的39组合总和以及40组合总和2。原创 2023-12-27 14:24:57 · 372 阅读 · 0 评论 -
javascript中二叉树的回溯与双指针
本题我们需要找一条符合条件的路径,而这个二叉树并不是搜索二叉树,只能采用穷举的方法,而穷举也是有技巧的,并不是一次一次从跟节点穷举,而是通过子节点返回的值判断穷举是否成功,否则就回溯。回溯虽然挺起来挺高大上的,其实在二叉树中大部分都是通过递归解决问题,而如果递归函数中有意义明确的返回值,基本上就会有回溯的过程,返回值:如果计数器归0说明穷举成功返回true,而既然子节点若返回true,那么父节点也即返回ture返回到顶层即可,若为false则返回false。确定递归函数的参数与返回类型。原创 2023-12-23 12:30:34 · 39 阅读 · 1 评论 -
关于二叉树的所有遍历方式
首先我们要说明一下递归的三要素以二叉树来学习递归几乎是最好的学习递归方式;接下来我们来仔细阐述一下在二叉树中的这三个要素首先,要做到递归,第一步就是定义一个可以循环利用的函数,那么定义函数第一步除去起函数名就是确认传入条件,又因为是可循环的函数那么确认return返回条件也是必须的。那么一力扣二叉树为例,递归要传入谁呢,毫无疑问就是根节点root。那么可以得到以下函数。那么接下来是否要确定返回条件了呢,需要注意的是,我们所说的返回条件不一定是return,而应该是收获胜利的果实。原创 2023-12-17 17:28:31 · 46 阅读 · 1 评论 -
滑动窗口最大值
【代码】滑动窗口最大值。原创 2023-12-11 17:40:54 · 38 阅读 · 1 评论 -
逆波兰表达式求值
【代码】逆波兰表达式求值。原创 2023-12-10 20:33:49 · 33 阅读 · 1 评论 -
用栈实现队列, 用队列实现栈
【代码】用栈实现队列, 用队列实现栈。原创 2023-12-10 20:30:45 · 36 阅读 · 1 评论 -
多个数组四数相加,赎金信
【代码】多个数组四数相加,赎金信。原创 2023-12-09 17:50:53 · 28 阅读 · 0 评论 -
有效的字母异位词,两个数组的交集,快乐数,两数之和
特别注意:6. 三个循环复制时不要搞混操作对象。原创 2023-12-08 23:24:51 · 25 阅读 · 0 评论 -
两两交换链表中的的节点,删除链表的倒数第N个节点,环形链表2
【代码】两两交换链表中的的节点,删除链表的倒数第N个节点,环形链表2。原创 2023-12-03 17:22:38 · 25 阅读 · 1 评论 -
移除链表元素
6. 返回的是pre,而非current因为此时的current已经指向null。原创 2023-12-02 21:22:44 · 26 阅读 · 0 评论 -
有序数组的平方,长度最小的子数组,螺旋矩阵2
先说思路,因为是有序数组,所以最大值一定在头或尾,只需要比较头尾平方后的值,大的值放在新数组的尾部,尾部向头部前进一位,继续比较即可完整代码。原创 2023-12-02 15:36:25 · 27 阅读 · 0 评论 -
双指针,头尾二分法查找、双头快慢指针
头为0尾为数组长度-1对中间值与标签值进行比较,并不断缩小区间循环变量,注:因为是左闭右闭区间,所以右区间可以取到值,左区间就也可以取到合法值完整代码。原创 2023-12-02 14:21:34 · 35 阅读 · 0 评论