- 博客(99)
- 资源 (29)
- 收藏
- 关注
原创 组合(77+ 39 + 40 + 17) + 排列(46 + 47) + 子集(78) + 分割(131 + 93)
集合中没有重复的元素,元素只能使用一次。解集不能包含重复的组合。
2023-01-25 19:11:40
420
原创 打家劫舍问题
对于环形就是相当于第一个和最后一个房屋不可以同时偷,那么分两种情况,注意需要转换到偷的上面。不偷第一个,相当于偷第2个到偷第n个。不偷第n个,相当于偷第1个到偷第n-1个。取这两种情况的最大。
2023-01-07 12:09:50
254
原创 背包问题:01背包+完全背包+有关题目
使用二维数组 dp[i] [j] 表示从下标为[0-i]的物品里任意取,放进容量为j的背包,价值总和最大是多少。确定递推公式dp数组的初始化首先从dp[i][j] 的定义出发,如果背包容量j为0的话,即dp [i] [0] ,无论是选取哪些物品,背包价值总和一定为0。如图:状态转移方程 dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);可以看出i 是由 i-1 推导出来,那么i为0的时候就一定要初始化。
2022-12-15 19:22:26
603
原创 96. 不同的二叉搜索树 JavaScript实现
即 dp[i] += dp[以j为头结点左子树节点数量] * dp[以j为头结点右子树节点数量]。j 相当于是头结点的元素,从1遍历到i为止。所以递推公式:dp[i] += dp[j - 1] * dp[i - j];,j-1 为j为头结点左子树节点数量,i-j 为以j为头结点右子树节点数量。首先一定是遍历节点数,从递归公式:dp[i] += dp[j - 1] * dp[i - j]可以看出,节点数为i的状态是依靠 i之前节点数的状态。那么遍历i里面每一个数作为头结点的状态,用j来遍历。
2022-12-13 19:55:25
128
原创 最近公共祖先问题
这题让求二叉搜索树的最近公共祖先,而二叉搜索树的特点就是 左子树的所有节点都小于当前节点,右子树的所有节点都大于当前节点,并且每棵子树都具有上述特点,所以这题就好办了,从更节点开始遍历。这个题目可以用上面的揭发,也可以用更加简单的方法。
2022-12-01 11:31:43
134
原创 二叉树路径问题+递归+有关题目
顾名思义,就是从某一个节点(不一定是根节点),从上向下寻找路径,到某一个节点(不一定是叶节点)结束,具体题目如下:而继续细分的话还可以分成一般路径与给定和的路径。
2022-11-24 14:23:57
432
原创 347. 前 K 个高频元素 JavaScript实现
先用哈希表Map统计每个数据的个数,然后进行排序操作。重要的是排序操作,如果要求是优于O(nlogn),则可供选择的只有堆排序和同排序。
2022-11-06 20:33:40
302
原创 242. 有效的字母异位词 JavaScript实现
需要把字符映射到数组也就是哈希表的索引下标上,因为字符a到字符z的ASCII是26个连续的数值,所以字符a映射为下标0,相应的字符z映射为下标25。所以需要将 s[i] - ‘a’ 所在的元素做+1 操作即可,并不需要记住字符a的ASCII,只要求出一个相对数值就可以了。2、在遍历字符串t的时候,对t中出现的字符映射哈希表索引上的数值再做-1的操作。最后检查一下,record数组如果有的元素不为零0,说明字符串s和t一定是谁多了字符或者谁少了字符,return false。...
2022-09-01 15:12:05
256
原创 【leetcode】数组总结篇
数组中的元素为什么不能删除: 数组在内存中是连续的地址空间,不能释放单一元素,如果要释放,就是全释放(程序运行结束,回收内存栈空间)。
2022-07-11 09:46:10
176
原创 209. 长度最小的子数组 JavaScript实现
题目链接把队列当作滑动窗口除了使用这样的队列进行控制,还可以直接使用指针来控制。这样不用使用额外的空间二、直接使用滑动窗口解法一我们使用的是使用两个指针,我们也可以把它看做是一个窗口,每次往窗口中添加元素来判断是否满足。其实我们可以逆向思维,先固定一个窗口大小比如 leng,然后遍历数组,查看在数组中 leng 个元素长度的和是否有满足的,如果没有满足的我们就扩大窗口的大小继续查找,如果有满足的我们就记录下窗口的大小 leng,因为这个 leng 不一定是最小的,我们要缩小窗口的大小再继续找。...
2022-07-10 11:28:22
125
原创 977. 有序数组的平方 JavaScript实现
题目链接直接调用API,默认使用快排使用O(n) 时间复杂度解决。方法:比较左右两边数据的大小,分别用指针控制走向。每次将大的数据从头部塞入即可
2022-07-10 09:51:04
196
原创 234. 回文链表 JavaScript实现
题目链接因为在链表中访问一个特定的节点需要O(n),而这个题目是需要遍历一半链表数量的节点,前后进行比较。二、快慢指针避免使用 O(n)O(n) 额外空间的方法就是改变输入。我们可以将链表的后半部分反转(修改链表结构),然后将前半部分和后半部分进行比较(反转后的前后链表应该是一样的)。1、找到中间节点,将链表拆分2、反转后半部分链表3、判断回文,前后链表是否相等4、恢复链表5、返回结果...
2022-06-17 17:18:28
382
原创 64. 最小路径和 JavaScript实现
题目链接这个题目和1143.最长公共子序列思想类似,1143最后构建的也是网格,然后根据不同的位置去更新网格的值。动态规划求解的原因:由于每个元素对应的最小路径和与其相邻元素对应的最小路径和有关,所以可以使用动态规划求解1、dp数组的含义dp[i][j] 表示 从左上角出发到网格中(i,j)位置的最小路径和。则dp[m-1][n-1]时最后的结果,即右下角的元素。2、初始化dp数组dp[0][0] = grid[0][0]3、状态转移方程三、代码优化可以不用重新创建一个dp数组进行存储,可以在原
2022-06-15 21:31:47
159
原创 165. 比较版本号 JavaScript实现
题目链接将字符串(版本号)按照 . 分割符进行分割成不同的修订号,并且将这些修订号存放在两个数组当中。同时遍历这两个数组,比较它们的值。注意:
2022-06-14 16:43:28
460
原创 111. 二叉树的最小深度 JavaScript实现
题目链接递归找左右子树的最小深度,然后选更小的.这里使用的是深度优先遍历,也可以使用层次遍历。与543.二叉树的直径相比:
2022-06-11 16:23:58
310
原创 98. 验证二叉搜索树 JavaScript实现
题目链接一个二叉搜索树的中序遍历是一个递增序列,所以只需要中序遍历这个二叉树,然后判断这个序列是否是递增序列即可。注意:1、二叉搜索树的定义是左子树所有节点小于中间节点,右子树所有节点大于中间节点。所以不能单纯的比较左节点小于中间节点,右节点大于中间节点就完事了。...
2022-06-09 14:28:04
199
原创 43. 字符串相乘 JavaScript实现
题目链接这个题目和415.字符串相加很相似。遍历nums2的每一位和nums1进行相乘,将每一步的结果进行相加。注意点:补0的操作:num2 除了第一位的其他位与 num1 运算的结果需要 补0。不止是相加的时候要进行补0,在得到每步相乘的结果的时候也需要补0....
2022-06-03 10:06:38
412
原创 322. 零钱兑换 JavaScript实现
题目链接题目中说每种硬币的数量是无限的,可以看出是典型的完全背包问题。其实和爬楼梯的思路有点像,总金额就是爬到第几层楼梯。不同的面值数就是依次可以爬一楼或者两楼。但是这里需要取到最少的硬币数量,所以需要遍不同的面值,从而确定最小的数量。dp[i]表示凑足总额为j所需的硬币的最少个数时多少。对于dp[0~i]的每个状态,循环coins数组,寻找可以兑换的组合,用i面额减去当前硬币价值,dp[i-coin]在加上一个硬币数就是dp[i],最后取最小值就是答案dp[i] = Math.min(dp[i], dp[
2022-06-01 20:41:13
448
原创 155. 最小栈 JavaScript实现
155. 最小栈题目链接一、思想用一个辅助栈去存储当前栈中的最小值,这样就可以在常数项时间里检索到栈中的最小元素。1、push操作,当插入元素的时候,辅助栈里的栈顶元素需要和这个元素进行比较,将最小的元素存入辅助栈中,这样辅助栈的栈顶元素永远都是最小的。2、pop操作,当弹出元素的时候,需要将辅助栈的栈顶元素一并弹出,这样辅助栈的栈顶元素一定是当前元素栈里的最小值。(避免弹出的元素就是当前的最小值)二、代码实现var MinStack = function() { this.x_st
2022-05-31 18:08:26
214
原创 110. 平衡二叉树 JavaScript实现
110. 平衡二叉树题目链接一、自顶向下(暴力法)1、一棵树是平衡二叉树的条件是它的左右子树高度差不超过1,并且左右子树也是平衡二叉树2、这个定义里面涉及到高度计算的问题,所以需要另外设置函数。代码实现var isBalanced = function(root) { // 对于空节点的判断 if(!root) return true; // 一棵树是平衡二叉树的条件是它的左右子树高度差不超过1,并且左右子树也是平衡二叉树 if(Math.abs(depth(r
2022-05-27 20:55:32
212
原创 从遍历序列中构造二叉树有关题目
105. 从前序与中序遍历序列构造二叉树题目链接一、递归先序遍历的顺序是根节点,左子树,右子树。中序遍历的顺序是左子树,根节点,右子树。1、根据先序遍历得到根节点2、在中序遍历中找到根节点的位置,将其左子树和右子树找到3、在左子树和右子树上递归的进行二、代码实现 // 递归的建立二叉树,本身就写成一个递归函数var buildTree = function(preorder, inorder) { // 首先在先序里面找到根节点的值,并将这个值建立root节点 let te
2022-05-27 16:09:26
197
原创 104. 二叉树的最大深度 JavaScript实现
104. 二叉树的最大深度题目链接一、思想对二叉树进行层次遍历,用一个变量指控层数即可。二、代码实现var maxDepth = function(root) { if(!root) return 0; let queue = []; // 初始化队列 queue.push(root); // 控制层数 let level = 0; // 遍历二叉树,队列不为空 while(queue.length){ // 弹
2022-05-26 16:09:37
196
原创 93. 复原 IP 地址 JavaScript实现
93. 复原 IP 地址题目链接一、回溯法由于我们需要找出所有可能复原出的 IP 地址,因此可以考虑使用回溯的方法。题目详解二、代码实现var restoreIpAddresses = function(s) { let res=[]; // 遍历4层决策树,用start指针遍历整个字符串。 var dfs = function(subRes,start){ // 递归终止的条件 -- 切割的片段满4段,且耗尽所有字符 if(subR
2022-05-26 15:22:43
329
原创 151. 颠倒字符串中的单词 JavaScript实现
151. 颠倒字符串中的单词题目链接一、API解法var reverseWords = function(s) { // 1、使用trim去掉头尾的空格 // 2、使用split 将字符串按空格分割成字符串数组,至少一个空格. // 3、使用 reverse 将字符串数组进行反转; // 4、使用空格进行相连 return s.trim().split(/\s+/).reverse().join(" ");};二、双端队列将分割和反转的任务利用双端队列
2022-05-25 16:20:24
125
[kaoyan.com]2004年中国地质大学_武汉_数据结构与程序设计考研试题.pdf
2021-04-02
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人