算法
TRAPPIST-1e-Luna
Agent
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
LeetCode题解:2363. 合并相似的物品,哈希表,详细注释
【代码】LeetCode题解:2363. 合并相似的物品,哈希表,详细注释。原创 2023-02-28 15:59:57 · 254 阅读 · 0 评论 -
LeetCode题解:2363. 合并相似的物品,双指针,详细注释
【代码】2363. 合并相似的物品,双指针,详细注释。原创 2023-02-28 15:44:04 · 176 阅读 · 0 评论 -
LeetCode题解:1238. 循环码排列,归纳法,详细注释
【代码】LeetCode题解:1238. 循环码排列,归纳法,详细注释。原创 2023-02-27 17:39:03 · 482 阅读 · 0 评论 -
LeetCode题解:2357. 使数组中所有元素都等于零,哈希表,详细注释
【代码】LeetCode题解:2357. 使数组中所有元素都等于零,哈希表,详细注释。原创 2023-02-24 14:25:42 · 140 阅读 · 0 评论 -
LeetCode题解:2357. 使数组中所有元素都等于零,排序,详细注释
【代码】LeetCode题解:2357. 使数组中所有元素都等于零,排序,详细注释。原创 2023-02-24 13:18:26 · 160 阅读 · 0 评论 -
LeetCode题解:938. 二叉搜索树的范围和,BFS,JavaScript,详细注释
【代码】LeetCode题解:938. 二叉搜索树的范围和,BFS,JavaScript,详细注释。原创 2023-02-21 22:46:49 · 425 阅读 · 0 评论 -
LeetCode题解:2347. 最好的扑克手牌,哈希表,详细注释
【代码】LeetCode题解:2347. 最好的扑克手牌,哈希表,详细注释。原创 2023-02-20 23:26:00 · 239 阅读 · 0 评论 -
LeetCode:240. 搜索二维矩阵 II,二分查找,详细注释
【代码】LeetCode:240. 搜索二维矩阵 II,二分查找,详细注释。原创 2023-02-20 23:25:02 · 133 阅读 · 0 评论 -
LeetCode:240. 搜索二维矩阵 II,直接查找,详细注释
【代码】LeetCode:240. 搜索二维矩阵 II,直接查找,详细注释。原创 2023-02-19 14:31:13 · 129 阅读 · 0 评论 -
LeetCode题解:1237. 找出给定方程的正整数解,双指针,详细注释
【代码】LeetCode题解:1237. 找出给定方程的正整数解,双指针,详细注释。原创 2023-02-18 20:04:21 · 112 阅读 · 0 评论 -
LeetCode题解:1237. 找出给定方程的正整数解,二分查找,详细注释
【代码】LeetCode题解:1237. 找出给定方程的正整数解,二分查找,详细注释。原创 2023-02-18 19:03:25 · 154 阅读 · 0 评论 -
LeetCode题解:1237. 找出给定方程的正整数解,枚举,详细注释
【代码】LeetCode题解:1237. 找出给定方程的正整数解,枚举,详细注释。原创 2023-02-18 18:02:29 · 119 阅读 · 0 评论 -
LeetCode题解:938. 二叉搜索树的范围和,DFS,详细注释
LeetCode题解:938. 二叉搜索树的范围和,DFS,详细注释原创 2023-02-17 13:15:58 · 171 阅读 · 0 评论 -
LeetCode题解:897. 递增顺序搜索树,栈,JavaScript,详细注释
原题链接:897. 递增顺序搜索树 解题思路: 使用中序遍历,即可按顺序获取到二叉搜索树的每个节点。 创建一个新树,用leaf表示其叶子节点。 每次遍历到节点时,都进行如下操作: 将遍历到的节点连接到leaf.right。 将leaf移动到leaf.right,保持它一直指向叶子节点。 将leaf.left设置为null,打断节点原有的连接,避免新树出现环。 /** * @param {TreeNode} root * @return {TreeNode} */ var incre原创 2021-09-07 09:01:02 · 248 阅读 · 0 评论 -
2021-09-06LeetCode题解:897. 递增顺序搜索树,递归,JavaScript,详细注释
原题链接:897. 递增顺序搜索树 解题思路: 使用中序遍历,即可按顺序获取到二叉搜索树的每个节点。 创建一个新树,用leaf表示其叶子节点。 每次遍历到节点时,都进行如下操作: 将遍历到的节点连接到leaf.right。 将leaf移动到leaf.right,保持它一直指向叶子节点。 将leaf.left设置为null,打断节点原有的连接,避免新树出现环。 /** * @param {TreeNode} root * @return {TreeNode} */ var incre原创 2021-09-06 13:03:50 · 273 阅读 · 0 评论 -
LeetCode题解:143. 重排链表,数组,JavaScript,详细注释
原题链接:143. 重排链表 解题思路: 将链表的每个元素都放入数组list。 使用左指针i和右指针j向中间推进直到相遇。 将i和j所指元素依次存入新数组newList中。 遍历newList,生成新链表并返回。 /** * @param {ListNode} head * @return {void} Do not return anything, modify head in-place instead. */ var reorderList = function (head) { let原创 2021-09-01 21:00:20 · 320 阅读 · 0 评论 -
LeetCode题解:28. 实现 strStr(),暴力法,JavaScript,详细注释
原题链接:28. 实现 strStr() 解题思路: 从i = 0到i = haystack.length - needle.length遍历haystack。 从i开始,逐个判断needle.length长度的字符,是否每个字符都与needle的字符相同,如果是则表示找到needle,返回i。 /** * @param {string} haystack * @param {string} needle * @return {number} */ var strStr = function (原创 2021-08-23 14:08:04 · 178 阅读 · 0 评论 -
LeetCode题解:2. 两数相加,迭代,JavaScript,详细注释
原题链接:2. 两数相加 解题思路: 使用一个新链表存储结果,node代表新链表的每个节点。 创建一个dummy节点,dummy.next指向新链表的头结点。 使用plus变量,缓存两个值加和后,需要进位的结果,可为0或1。 同时遍历l1和l2,将其想加结果存储在node中,node.val = l1.val + l2.val + plus。 /** * @param {ListNode} l1 * @param {ListNode} l2 * @return {ListNode} */ var原创 2021-08-20 09:05:06 · 220 阅读 · 0 评论 -
LeetCode题解:27. 移除元素,JavaScript,详细注释
原题链接:27. 移除元素 解题思路: 用moveIndex始终指向存放不等于val的元素位置。 遍历nums,遇到不等于val的元素,就将其存入nums[moveIndex],并将moveIndex加1。 /** * @param {number[]} nums * @param {number} val * @return {number} */ var removeElement = function (nums, val) { let moveIndex = 0 // 放置不等于va原创 2021-08-19 09:48:15 · 242 阅读 · 0 评论 -
LeetCode题解:219. 存在重复元素 II,哈希表,JavaScript,详细注释
原题链接:219. 存在重复元素 II 解题思路: 使用哈希表缓存遇到的所有元素索引。 当遇到元素已在哈希表中缓存时,判断是否满足条件。若满足,则返回true。 /** * @param {number[]} nums * @param {number} k * @return {boolean} */ var containsNearbyDuplicate = function (nums, k) { let map = new Map(); // 使用哈希表缓存遇到过数字的索引 /原创 2021-08-18 13:48:30 · 230 阅读 · 0 评论 -
LeetCode题解:217. 存在重复元素,哈希表,JavaScript,详细注释
原题链接:217. 存在重复元素 解题思路: 遍历数组,使用哈希表缓存遇到的数字。 如果遇到的数字已存在于哈希表,表示出现重复。 /** * @param {number[]} nums * @return {boolean} */ var containsDuplicate = function (nums) { let set = new Set(); // 使用哈希表缓存已知元素 // 遍历每个数字 for (const num of nums) { // 如果数字已存原创 2021-08-17 13:40:12 · 201 阅读 · 0 评论 -
LeetCode题解:220. 存在重复元素 III,暴力法,JavaScript,详细注释
原题链接:220. 存在重复元素 III 解题思路: 使用双循环遍历所有可能的下标i和j,并根据要求判断下标是否满足条件,满足则返回true。 如果能退出循环,表示没有找到满足条件的下标,返回false。 为避免重复,j只需要遍历i之后的下标即可。 /** * @param {number[]} nums * @param {number} k * @param {number} t * @return {boolean} */ var containsNearbyAlmostDuplicat原创 2021-08-16 08:48:47 · 190 阅读 · 0 评论 -
LeetCode题解:208. 实现 Trie (前缀树),对象,JavaScript,详细注释
原题链接:208. 实现 Trie (前缀树) 解题思路: 前缀树的每一个节点都用给一个对象表示。 单词的每个字母都作为一个节点的key,其value为一个对象。 在单词结束的节点,插入key和value都为EOF表示单词在此结束。 进行插入操作时,将每个字母作为一个节点,按顺序插入到前缀树中。 进行搜索时,按字母顺序在前缀树中查询,遇到EOF表示单词在前缀树中。 /** * Initialize your data structure here. */ var Trie = function ()原创 2021-08-15 11:55:32 · 193 阅读 · 0 评论 -
LeetCode题解:781. 森林中的兔子,贪心,JavaScript,详细注释
原题链接:781. 森林中的兔子 解题思路: 如果一只兔子说还有n只兔子与它有相同颜色,那么必然存在n + 1只兔子。 answers中并不包含所有兔子,也就是说[2]、[2, 2]、[2, 2, 2]三种情况其实是一样的。 如果answers = [2, 2, 2],只有当兔子数量为3只时,才能满足任意一只能告诉你还有2只与它有相同颜色。 如果answers = [2, 2, 2, 2],此时回答可以拆分成两组,分别是[2, 2, 2]和[2],共有6只兔子。 因此问题就转换为,将answers按照回答原创 2021-08-12 09:16:29 · 216 阅读 · 0 评论 -
LeetCode题解:80. 删除有序数组中的重复项 II,JavaScript,详细注释
原题链接:80. 删除有序数组中的重复项 II 解题思路: 使用哈希表统计每个数字出现的次数。 使用指针index指向当前要填入数字的位置。 次数小等于2时,将当前数字填入index位置,之后将index向后移动一位。 /** * @param {number[]} nums * @return {number} */ var removeDuplicates = function (nums) { let map = new Map() // 使用哈希表统计每个数字的数量 let ind原创 2021-08-11 20:38:48 · 186 阅读 · 0 评论 -
LeetCode题解:173. 二叉搜索树迭代器,栈,JavaScript,详细注释
原题链接:173. 二叉搜索树迭代器 解题思路: 对二叉搜索树进行中序遍历,即可按顺序输出二叉搜索树的每个值。 我们可以先回顾一下,使用栈辅助进行中序遍历的代码。 var inorderTraversal = function (root) { let result = []; let stack = []; let curr = root; while (stack.length || curr) { while (curr) { stack.push(curr)原创 2021-08-04 12:54:33 · 223 阅读 · 0 评论 -
LeetCode题解:173. 二叉搜索树迭代器,递归,JavaScript,详细注释
原题链接:173. 二叉搜索树迭代器 解题思路: 对二叉搜索树进行中序遍历,即可按顺序得到二叉搜索树的每个值。 先对输入二叉搜索树进行中序遍历,将结果保存到数组list中。 使用一个指针index,始终指向next对应的取值位置。每次调用next,都将指针向后移动一位。如果index指向类型为number,hasNext返回true。 /** * @param {TreeNode} root */ var BSTIterator = function (root) { this.list = [原创 2021-08-03 12:43:36 · 200 阅读 · 0 评论 -
LeetCode题解:61. 旋转链表,双指针,JavaScript,详细注释
原题链接:61. 旋转链表 解题思路: 输入:head = [1,2,3,4,5], k = 2。 如果将链表连接成环,会变成这样的样子:[1,2,3,4,5,1,2,3,4,5, ...]。 此时我们只要将3 → 4的连接打断,即可得到结果:[4,5,1,2,3]。 可以把问题按步骤解决: 创建两个指针,slow = 1, fast = 1。 将fast向前移动2位,指向3。 再将slow和fast同时向前移动,知道fast指向尾结点,此时slow正好停留在链表要断点的位置。 将fast与head连接原创 2021-07-30 15:06:36 · 168 阅读 · 0 评论 -
LeetCode题解:61. 旋转链表,闭合为环,JavaScript,详细注释
原题链接:61. 旋转链表 解题思路: 输入:head = [1,2,3,4,5], k = 2。 如果将链表连接成环,会变成这样的样子:[1,2,3,4,5,1,2,3,4,5, ...]。 此时我们只要将3 → 4的连接打断,即可得到结果:[4,5,1,2,3]。 由于开始时,我们只知道链表的头节点,因此要把问题按步骤解决: 用一个指针node,从链表的头节点移动到尾结点,统计链表长度。 将链表尾结点与头结点连接。 用一个指针breakNode,将其移动到需要打断的位置,breakNode的下一个节原创 2021-07-29 17:23:27 · 270 阅读 · 0 评论 -
LeetCode题解:456. 132 模式,n平方暴力,JavaScript,详细注释
原题链接:456. 132 模式 解题思路: 该题的条件是:i < j < k 和 nums[i] < nums[k] < nums[j]。 可以理解为,在已知nums[i]和nums[j]的情况下,查找是否存在nums[k],满足条件nums[i] < nums[k] < nums[j]。 nums[i]可以用变量numsi缓存,始终存储从nums[0]到nums[j-1]之间的最小值。 因此只需要用第一层循环,不断查找nums[j],同时缓存numsi。 用第二层循原创 2021-07-28 13:18:45 · 163 阅读 · 0 评论 -
LeetCode题解:341. 扁平化嵌套列表迭代器,DFS,JavaScript,详细注释
原题链接:341. 扁平化嵌套列表迭代器 解题思路: 输入: nestedList=[[1,1],2,[1,1]]时,nestedList[0]也是一个NestedInteger类型,只是nestedList[0].getInteger() === null。 可以将nestedList当做一个树,每个节点可以通过getInteger方法获取当前值,通过getList方法获取下一层节点。 使用DFS,先搜索出树的所有节点的值,将值都存入数组。 使用一个指针index,始终指向next对应的取值位置。每次调原创 2021-05-17 10:21:03 · 161 阅读 · 0 评论 -
LeetCode题解:150. 逆波兰表达式求值,栈,JavaScript,详细注释
原题链接:150. 逆波兰表达式求值 解题思路: 逆波兰表达式的计算方式,是先从左到右查找待计算的数字,当遇到算符后,将临近的两个数字取出进行相应计算,并将计算结果替换掉原数字和算符。 因此,这是一种先入后出的计算方式,可以使用栈解决: 遍历tokens,将数字都入栈。 如果遇到算符,从栈中取出两个数字进行相应计算。 算式中两个元素的顺序,总是stack[stack.length - 2]在前,stack[stack.length - 1]在后。 将计算结果入栈,等待下一次计算。 完成所有计算后,原创 2021-05-07 09:19:11 · 174 阅读 · 0 评论 -
LeetCode题解:191. 位1的个数,位运算,JavaScript,详细注释
原题链接:191. 位1的个数 解题思路: 利用位运算n = n & (n - 1),每次可以清除二进制数中最后一个1。 每次循环进行上述操作,并统计1的数量,直到n被清零为止。 /** * @param {number} n - a positive integer * @return {number} */ var hammingWeight = function (n) { let count = 0; // 统计1的数量 // 不断循环直到1被清空 while (n原创 2021-04-30 09:26:39 · 210 阅读 · 0 评论 -
LeetCode题解:151. 翻转字符串里的单词,栈,JavaScript,详细注释
原题链接:151. 翻转字符串里的单词 解题思路: 从前向后遍历s,非空格都为单词,将单词依次存入栈。 将单词依次出栈,用空格间隔,连接成新字符串,即可实现翻转。 /** * @param {string} s * @return {string} */ var reverseWords = function (s) { let stack = []; // 使用栈存储字符串中的单词 let word = ''; // 临时缓存单词 let result = ''; // 存储翻转后字原创 2021-04-29 08:54:01 · 292 阅读 · 0 评论 -
LeetCode题解:151. 翻转字符串里的单词,数组,JavaScript,详细注释
原题链接:151. 翻转字符串里的单词 解题思路: 将字符串按空格切割成数组,将数组翻转后再合并成字符串,就完成了字符串的翻转。 需要注意以下两点: 原字符串的首尾会有空格。 输入的空格数量不止一个,而输出只能有一个空格。 /** * @param {string} s * @return {string} */ var reverseWords = function (s) { return s .trim() // 去除首尾空格 .split(/\s+/) // 按多原创 2021-04-28 08:58:35 · 155 阅读 · 0 评论 -
LeetCode题解:73. 矩阵置零,栈,JavaScript,详细注释
原题链接:73. 矩阵置零 解题思路: 遍历矩阵,找到所有为0的坐标,将它们都存入栈。 从栈中依次弹出坐标,并将对应的行、列元素都设置为0。 /** * @param {number[][]} matrix * @return {void} Do not return anything, modify matrix in-place instead. */ var setZeroes = function (matrix) { let stack = []; // 使用栈存储矩阵中为0的坐标原创 2021-04-25 15:43:11 · 211 阅读 · 0 评论 -
LeetCode题解:641. 设计循环双端队列,使用数组,JavaScript,详细注释
原题链接:641. 设计循环双端队列 解题思路: 如果你看到这题的时候,感到没有思路,可以先尝试其前导题目:622. 设计循环队列,以及我的题解LeetCode题解:622. 设计循环队列,使用数组,JavaScript,详细注释。 创建数组: 先按照队列的容量,创建相应长度的数组,所有元素都默认为-1。这样获得元素时,只要直接返回即可。 使用head指针,指向队首元素。使用tail指针,指向将要从队尾插入元素的位置,及队尾+1。 插入元素: 从头部添加元素时,先将head指针向前移动一位,再将元素插原创 2021-04-23 11:00:18 · 195 阅读 · 0 评论 -
LeetCode题解:145. 二叉树的后序遍历,栈,JavaScript,详细注释
原题链接:145. 二叉树的后序遍历 解题思路: 对于该题,我们可以首先看后续遍历对应的示意图,图片来自官方题解。 后续遍历最后的输出顺序,就是按照图中的1-2-3-4-5。我们需要做的,其实是如何使用一个栈来实现这个过程。 从图片中,可以看到输出节点的顺序是从下到上,从左到右。 我们可以使用栈来进行遍历,每次循环入栈元素都为从上到下,从左到右。 那么每次循环时出栈元素的顺序都为从上到下,从右到左。 但此时的栈的元素输出顺序与需要的结果顺序正好相反。 解决方案就是将输出的结果插入到结果数组的头部,这样最原创 2021-04-20 08:50:11 · 178 阅读 · 0 评论 -
LeetCode题解:17. 电话号码的字母组合,回溯,JavaScript,详细注释
原题链接:17. 电话号码的字母组合 解题思路: 假设输入是'23',那么就需要在'2'对应的字母映射'abc'中分别选取一个。再以此为基础,从'3'对应的字母映射'def'中选取一个,组合成最终结果。 由于输入的数字并不确定长度,因此选择用递归的方式遍历digits。 每层递归处理的都通过参数current,选择当前需要处理的字母映射。 在递归中利用for循环遍历字母映射,逐个完成对字母的选中,之后下探到下层递归,处理下一个数字。 /** * @param {string} digits * @r原创 2021-04-16 09:02:19 · 134 阅读 · 0 评论 -
LeetCode题解:剑指 Offer 49. 丑数,三指针,JavaScript,详细注释
原题链接:剑指 Offer 49. 丑数 解题思路: 参考了详细通俗的思路分析,多解法中的解法三。 在使用堆的解法中,每一个丑数都是由之前最小的丑数分别乘以2、3、5计算而来,生成的序列如下: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, … 如果将其拆分则是下面这样的: 1, 1×2, 1×3, 2×2, 1×5, 2×3, 2×4, 3×3, 3×4, 3×5... 按照上面的规律,可以将其按照各个质因数将其拆分成下面三组: 乘 2: 1×2, 2×2, 3×2, 4×原创 2021-04-14 13:48:23 · 152 阅读 · 0 评论
分享