![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
刷题笔记
文章平均质量分 55
Leetcode刷题整理
La vie est belle❤️
长长的路,慢慢地走
展开
-
LeetCode1448 统计二叉树中好节点的数目
LeetCode1448 统计二叉树中好节点的数目题目解题:深度优先搜索题目解题:深度优先搜索// javascriptvar goodNodes = function(root) { // 统计好节点的个数 let goodNodeCnt = 0; const dfs = (root, maxValAbove) => { if (root === null) return; // maxValAbove 用于记录从顶层递归到本层的最原创 2022-03-16 23:17:50 · 509 阅读 · 0 评论 -
LeetCode93 复原 IP 地址
LeetCode93 复原 IP 地址题目解题:回溯题目解题:回溯// javascriptvar restoreIpAddresses = function(s) { const SEG_COUNT = 4; const segments = new Array(SEG_COUNT); const ans = []; const dfs = (s, segId, segStart) => { // 如果找到了 4 段 IP 地址并且遍历原创 2022-01-01 22:53:46 · 179 阅读 · 0 评论 -
LeetCode143 重排链表
LeetCode143 重排链表题目解题解题一:线性表解题二:寻找链表中点 + 链表逆序 + 合并链表题目解题解题一:线性表// javascriptvar reorderList = function(head) { if (head === null) return; const vec = new Array(); let curr = head; while (curr !== null) { vec.push(curr);原创 2022-01-01 18:37:27 · 372 阅读 · 0 评论 -
LeetCode92 反转链表 II
LeetCode92 反转链表 II题目解题解题一:穿针引线解题二:一次遍历「穿针引线」反转链表(头插法)题目解题解题一:穿针引线// javascriptvar reverseBetween = function(head, left, right) { // 因为头节点有可能发生变化,使用虚拟头节点可以避免复杂的分类讨论 const dummyHead = new ListNode(0, head); let prev = dummyHead; // 第原创 2022-01-01 16:44:54 · 322 阅读 · 0 评论 -
LeetCode25 K 个一组翻转链表
LeetCode25 K 个一组翻转链表题目解题题目解题// javascriptvar reverseKGroup = function(head, k) { const newHead = new ListNode(0); // 伪头节点 let tail = newHead; // 记录已完成翻转部分的尾节点 while (hasMoreThanKNode(head, k)) { //原创 2021-12-27 17:18:39 · 244 阅读 · 0 评论 -
LeetCode199 二叉树的右视图 & 剑指OfferII 046 二叉树的右侧视图
LeetCode199 二叉树的右视图 & 剑指OfferII 046 二叉树的右侧视图题目解题解题一:广度优先搜索解题二:深度优先搜索题目解题解题一:广度优先搜索// javascriptvar rightSideView = function(root) { if (root === null) return []; const result = []; const queue = [root]; while (queue.length > 0)原创 2021-12-26 16:10:02 · 430 阅读 · 0 评论 -
LeetCode455 分发饼干
LeetCode 455 分发饼干题目解题:排序+贪心题目解题:排序+贪心// javascriptvar findContentChildren = function(g, s) { const numOfChildren = g.length; const numOfCookies = s.length; g.sort((a, b) => a - b); s.sort((a, b) => a - b); let i = 0, j = 0;原创 2021-12-26 15:28:56 · 713 阅读 · 0 评论 -
LeetCode78 子集 &《程序员面试金典》面试题 08.04. 幂集
122原创 2021-09-01 17:21:33 · 132 阅读 · 1 评论 -
LeetCode2 两数相加 &《程序员面试金典》面试题 02.05. 链表求和
LeetCode2 两数相加 & 面试题 02.05. 链表求和题目解法简单版解法进阶版解法题目注意这边有两个问题:[简单版] 和 [进阶版]解法简单版解法// javascriptvar addTwoNumbers = function(l1, l2) { let sum = 0, carry = 0; let ResNode = new ListNode(0); const ResHead = ResNode; while (l1 !== null原创 2021-06-12 23:56:39 · 183 阅读 · 1 评论 -
LeetCode42 接雨水
LeetCode42 接雨水题目解题解题一:暴力解法解题二:动态规划解题三:单调栈解题四:双指针题目解题解题一:暴力解法// javascriptvar trap = function(height) { const n = height.length; let ans = 0; for (let i = 1; i < n - 1; ++i) { // 第一和最后一根柱子不可能接到雨水 let left_max = 0, right_m原创 2021-11-30 12:14:45 · 359 阅读 · 0 评论 -
LeetCode48 旋转图像 &《程序员面试金典》面试题 01.07. 旋转矩阵
LeetCode 面试题 01.07. 旋转矩阵题目解题解法一:使用辅助数组解法二:原地旋转解法三:用翻转代替旋转题目这道旋转矩阵题主要是去寻找规律。官方放了三种解法,讲解的非常详细。可以直接移步 官方解题。重复的地方便不写了,会就自己的思路进行一点补充。解题解法一:使用辅助数组对于矩阵中第 iii 行的第 jjj 个元素,在旋转后,它出现在倒数第 iii 列的第 jjj 个位置:matrixnew[col][n−row−1]=matrix[row][col]matrix_{new}[col原创 2021-06-08 00:43:09 · 180 阅读 · 4 评论 -
LeetCode137 只出现一次的数字 II & 剑指Offer 56 - II 数组中数字出现的次数 II
LeetCode137 只出现一次的数字 II & 剑指Offer 56 - II 数组中数字出现的次数 II题目解题解题一:哈希表解题二:依次确定每一个二进制位解题三:数字电路设计解题四:数字电路设计优化题目LeetCode137 只出现一次的数字 II:剑指Offer 56 - II 数组中数字出现的次数 II 中的限制有些区别,其余条件一样:解题解题一:哈希表// javascriptvar singleNumber = function(nums) { const原创 2021-11-24 21:48:20 · 198 阅读 · 0 评论 -
LeetCode260 只出现一次的数字 III & 剑指Offer 56 - I 数组中数字出现的次数
LeetCode260 只出现一次的数字 III & 剑指Offer 56 - I 数组中数字出现的次数题目解题:分组位运算题目解题:分组位运算相似题目:题目解题136. 只出现一次的数字LeetCode136 只出现一次的数字137. 只出现一次的数字 IITBD260. 只出现一次的数字 III、剑指 Offer 56 - I. 数组中数字出现的次数TBD也可以用位运算 x & (-x) 获取最低位的 1,即 let h = (原创 2021-11-24 15:51:40 · 122 阅读 · 0 评论 -
LeetCode387 字符串中的第一个唯一字符 & 剑指Offer 50 第一个只出现一次的字符
LeetCode剑指Offer 50 第一个只出现一次的字符题目解题解题一:使用哈希表存储频数解题二:使用哈希表存储索引解题三:队列题目解题解题一:使用哈希表存储频数// javascriptvar firstUniqChar = function(s) { const frequency = _.countBy(s); for (const ch of Object.keys(frequency)) { if (frequency[ch] === 1) {原创 2021-11-24 14:27:21 · 230 阅读 · 0 评论 -
LeetCode73 矩阵置零 &《程序员面试金典》面试题 01.08. 零矩阵
LeetCode 面试题 01.08. 零矩阵题目解题解题一:使用标记数组解题二:使用两个标记变量解法三:使用一个标记变量题目这道题思路很容易想,即要找到出现过 0 的行与列,把这些行/列的元素全部清 0。仔细想想题目是不是有陷阱?如果必须进行数组遍历的话,时间复杂度无法优化,那么空间复杂度呢?解题下面是官网上的3条提示,第一条的启示是第一遍遍历数组寻找并记录出现过 0 的行与列,第二遍再去修改。第二/三条分别对应了两种解法。如果你在找到 0 时清除了行和列,则可能会清理整个矩阵。在对矩阵进行原创 2021-06-08 23:38:12 · 115 阅读 · 1 评论 -
LeetCode151 翻转字符串里的单词 & 剑指Offer 58 - I 翻转单词顺序
LeetCode151 翻转字符串里的单词 & 剑指Offer 58 - I 翻转单词顺序题目解题解题一:使用语言特性解题二:队列解题三:原地翻转题目解题解题一:使用语言特性// javascriptvar reverseWords = function(s) { return s.trim().split(/\s+/).reverse().join(' ');};解题二:队列// javascriptvar reverseWords = function(s)原创 2021-11-24 00:03:05 · 462 阅读 · 0 评论 -
LeetCode《程序员面试金典》面试题 04.04. 检查平衡性 & 剑指Offer 55 - II & 110 平衡二叉树
LeetCode 面试题 04.04. 检查平衡性题目解题方法一:自顶向下的递归方法二:自底向上的递归题目解题这道题中的平衡二叉树的定义是:二叉树的每个节点的左右子树的高度差的绝对值不超过 1,则二叉树是平衡二叉树。根据定义,一棵二叉树是平衡二叉树,当且仅当其所有子树也都是平衡二叉树,因此可以使用递归的方式判断二叉树是不是平衡二叉树,递归的顺序可以是自顶向下或者自底向上。方法一:自顶向下的递归有了计算节点高度的函数,即可判断二叉树是否平衡。具体做法类似于二叉树的前序遍历,即对于当前遍历到的节点翻译 2021-08-09 00:34:49 · 112 阅读 · 0 评论 -
LeetCode946 验证栈序列 & 剑指Offer 31 栈的压入、弹出序列
LeetCode946 验证栈序列 & 剑指Offer 31 栈的压入、弹出序列题目解题:贪心题目解题:贪心代码参考:面试题31. 栈的压入、弹出序列(模拟,清晰图解)// javascriptvar validateStackSequences = function(pushed, popped) { const n = pushed.length; const stk = []; let i = 0; for (const num of pushed原创 2021-11-21 18:55:08 · 634 阅读 · 0 评论 -
LeetCode343 整数拆分 & 剑指Offer 14- I 剪绳子
LeetCode343 整数拆分 & 剑指Offer 14- I 剪绳子题目解题解题一:动态规划解题二:数学题目343 整数拆分 & 剑指Offer 14- I 剪绳子:解题解题一:动态规划因为至少要剪成两段,所以先选取第一段的长度 j,再去看剩下的 i - j 不拆分和拆分的情况。// javascriptvar cuttingRope = function(n) { const dp = new Array(n + 1).fill(0); for (le原创 2021-11-20 16:52:59 · 212 阅读 · 0 评论 -
LeetCode50 Pow(x, n) & 剑指Offer 16 数值的整数次方
@[toc](LeetCode50 Pow(x, n) & 剑指Offer 16 数值的整数次方)题目解题几个注意点:n 可正、可负、可为 0。一个数的 0 次方等于 1,严格来讲,0 的 0 次方是没有意义的,如果要追求统一,可以设置为1;n 为负整数时,结果是 1x−n{1 \over x^{-n}}x−n1x 可正、可负、可为 0。x 为 0 时,0 的 0 次方是 1,0 的正整数次方是 0,0 的负整数次方结果是 Inf,可以使用 10−n1 \over 0^{-n}0−n原创 2021-11-18 16:26:11 · 212 阅读 · 0 评论 -
LeetCode167 两数之和 II - 输入有序数组 & 剑指Offer 57 和为s的两个数字
LeetCode167 两数之和 II - 输入有序数组题目解题解题一:双指针解题二:二分查找题目解题解题一:双指针// javascriptvar twoSum = function(numbers, target) { const n = numbers.length; let left = 0, right = n - 1; while (left < right) { const sum = numbers[left] + numbers[原创 2021-11-17 23:06:12 · 71 阅读 · 0 评论 -
LeetCode33 搜索旋转排序数组
LeetCode33 搜索旋转排序数组题目解题:二分查找题目解题:二分查找一般在 不含重复元素的有序数组中查找元素 时,习惯用 left = mid + 1, right = mid - 1,循环条件为 left <= right 的二分查找模板,因为可以先拿 target 和 mid 比较,如果 mid 不符合条件,则将 mid 排除在区间外。mid 是 下取整,只有最后一次循环 left == right 时,nums[mid] 才会等于 nums[right],那次循环判断最后一个元原创 2021-11-14 15:40:42 · 438 阅读 · 0 评论 -
LeetCode154 寻找旋转排序数组中的最小值 II & 剑指Offer 11 旋转数组的最小数字
LeetCode154 寻找旋转排序数组中的最小值 II & 剑指Offer 11 旋转数组的最小数字题目解题解题一:暴力遍历解题二:二分查找题目难点在于可能拥有重复元素。解题解题一:暴力遍历解题二:二分查找...原创 2021-11-14 07:48:25 · 321 阅读 · 0 评论 -
LeetCode153 寻找旋转排序数组中的最小值
LeetCode153 寻找旋转排序数组中的最小值题目解题:二分查找题目解题:二分查找相似题目:题目解题153. 寻找旋转排序数组中的最小值解题154. 寻找旋转排序数组中的最小值 II 、剑指 Offer 11. 旋转数组的最小数字解题33. 搜索旋转排序数组解题// javascriptvar findMin = function(nums) { const n = nums.length; let left = 0, ri原创 2021-11-13 22:55:09 · 450 阅读 · 0 评论 -
LeetCode70 爬楼梯
LeetCode70 爬楼梯题目解题解题一:制表法自上而下递归解题二:动态规划自下而上递推解题三:矩阵快速幂解题四:通项公式题目解题与 LeetCode《程序员面试金典》面试题 08.01. 三步问题 类似解题一:制表法自上而下递归// javascriptvar climbStairs = function(n) { let memos = new Array(n + 1).fill(-1); // 制表 return climbStairsHelper(n, memos);原创 2021-10-04 14:35:32 · 134 阅读 · 0 评论 -
LeetCode454 四数相加 II
LeetCode454 四数相加 II题目解题:分组+哈希表题目解题:分组+哈希表// javascriptvar fourSumCount = function(nums1, nums2, nums3, nums4) { let cnt = 0; const map = new Map(); for (const a of nums1) { for (const b of nums2) { map.set(a + b, (map.原创 2021-11-05 14:49:43 · 69 阅读 · 0 评论 -
LeetCode170 两数之和 III - 数据结构设计
LeetCode170 两数之和 III - 数据结构设计题目解题解题一:哈希表解题二:排序 + 双指针题目解题解题一:哈希表// javascriptvar TwoSum = function() { this.map = new Map();};/** * @param {number} number * @return {void} */TwoSum.prototype.add = function(number) { this.map.set(numbe原创 2021-11-05 14:26:43 · 167 阅读 · 0 评论 -
LeetCode771 宝石与石头
LeetCode771 宝石与石头题目解题题目解题// javascriptvar numJewelsInStones = function(jewels, stones) { const jewelSet = new Set(Array.from(jewels)); let cnt = 0; for (const stone of stones) { if (jewelSet.has(stone) === true) { cnt+原创 2021-11-05 14:00:20 · 97 阅读 · 0 评论 -
LeetCode311 稀疏矩阵的乘法
LeetCode311 稀疏矩阵的乘法题目解题题目解题因为是稀疏矩阵,所以先找出非零的元素位置和值,只遍历非零位去做运算。// javascriptvar multiply = function(mat1, mat2) { const m1 = mat1.length, n1 = mat1[0].length; const m2 = mat2.length, n2 = mat2[0].length; if (!m1 || !n1 || !m2 || !n2 || n1 !原创 2021-11-05 13:31:10 · 192 阅读 · 0 评论 -
LeetCode219 存在重复元素 II
LeetCode219 存在重复元素 II题目解题解题一:哈希表解题二:哈希集合维护滑动窗口题目解题解题一:哈希表题目问的为是否存在,即如果有重复元素,那么任意两个重复元素之前的索引差 <= k,就返回 true。如果某个元素 A 出现在 i, j, k 三个位置,j - i > k,此时应该更新哈希表中 A 对应的索引,因为寻找的是不大于 k 的索引差,所以希望找到更小的索引差。比如:nums = [1,0,1,1], k = 1// javascriptvar conta原创 2021-11-05 10:59:33 · 83 阅读 · 0 评论 -
LeetCode599 两个列表的最小索引总和
LeetCode599 两个列表的最小索引总和题目解题解题一:哈希表解题二:暴力遍历题目注意返回的是数组,元素为符合要求的餐厅名称,而且存在索引和相等的情况,答案如果不止一个的话,要全部放入数组中返回。解题解题一:哈希表// javascriptvar findRestaurant = function(list1, list2) { const n1 = list1.length, n2 = list2.length; const map = new Map();原创 2021-11-05 10:37:14 · 102 阅读 · 0 评论 -
LeetCode205 同构字符串
LeetCode205 同构字符串题目解题题目解题// javascriptvar isIsomorphic = function(s, t) { const n1 = s.length, n2 = t.length; if (n1 !== n2) return false; const map1 = new Map(), map2 = new Map(); for (let i = 0; i < n1; ++i) { // 均没有记录原创 2021-11-05 09:58:55 · 86 阅读 · 0 评论 -
LeetCode897 递增顺序搜索树 & 剑指OfferII 052 展平二叉搜索树
LeetCode 897 递增顺序搜索树 & 剑指OfferII 052 展平二叉搜索树题目解题解题一:递归解题二:栈解题三:Morris 中序遍历题目解题二叉搜索树的增序排列就是中序遍历的顺序。LeetCode426 将二叉搜索树转化为排序的双向链表 & 剑指Offer 36 二叉搜索树与双向链表 的简单版,426 题需要构造的 双向循环链表,本题是单向链表,相当于 left 不用指向前驱节点,直接指向 null 就行,而且最后首尾相连的一步也不用。具体的思路不重复了,直接指原创 2021-11-04 15:18:29 · 100 阅读 · 0 评论 -
LeetCode426 将二叉搜索树转化为排序的双向链表 & 剑指Offer 36 二叉搜索树与双向链表
LeetCode426 将二叉搜索树转化为排序的双向链表 & 剑指Offer 36 二叉搜索树与双向链表题目解题解题一:递归解题二:栈解题三:Morris 中序遍历题目解题一道换汤不换药的「二叉树中序遍历题」,对二叉树中序遍历比较陌生的建议先移步 [])()。刚刚这道题是让按照中序遍历的顺序,构建节点 val 值的数组进行输出。本题不一样的地方在于是要构建一个 循环双向链表结构,left 指针等同于 prev 指针,right 指针等同于 next 指针,另外 首位要相连接(记录 head原创 2021-11-04 12:08:15 · 121 阅读 · 0 评论 -
LeetCode349 两个数组的交集
LeetCode349 两个数组的交集题目解题解题一:哈希表解题二:排序 + 双指针题目解题解题一:哈希表// javascriptconst set_intersection = (set1, set2) => { if (set1.size > set2.size) { return set_intersection(set2, set1); } const intersection = new Set(); for (const原创 2021-11-04 10:33:07 · 61 阅读 · 0 评论 -
LeetCode705 设计哈希集合 & 706 设计哈希映射
LeetCode705 设计哈希集合题目解题题目解题// javascriptvar MyHashSet = function() { this.BASE = 769; this.data = new Array(this.BASE).fill(0).map(() => new Array());};/** * @param {number} key * @return {void} */MyHashSet.prototype.add = functio原创 2021-11-03 23:00:58 · 105 阅读 · 0 评论 -
LeetCode138 复制带随机指针的链表 & 剑指Offer 35 复杂链表的复制
LeetCode138 复制带随机指针的链表 & 剑指Offer 35 复杂链表的复制题目解题解题一:回溯 + 哈希表解题二:迭代 + 节点拆分题目解题解题一:回溯 + 哈希表注意计入哈希表的操作一定要在寻找 next 和 random 指向的节点之前,否则如果存在环就会 exceeds maximum stack size。 这是因为哈希表内存储的是节点的地址,分配的地址是不会变的,后续如果该节点的值或 random / next 指向的节点发生了变化,我们通过该地址获取的还是最新的原创 2021-11-03 19:34:17 · 88 阅读 · 0 评论 -
LeetCode430 扁平化多级双向链表
LeetCode430 扁平化多级双向链表题目解题:深度优先搜索解题一:栈解题二:递归题目解题:深度优先搜索解题一:栈// javascriptvar flatten = function(head) { // prevNode 记录链表的最后一个非 null 节点 let curNode = head, prevNode = null; // 模拟递归的栈,用显式的栈来存放断点 const stack = []; while (curNode !原创 2021-11-02 15:10:58 · 89 阅读 · 0 评论 -
LeetCode328 奇偶链表
LeetCode328 奇偶链表题目解题:双指针题目解题:双指针oddHead 其实就是 head,可以直接用 head 代替。// javascriptvar oddEvenList = function(head) { if (head === null || head.next === null) return head; const oddHead = head, evenHead = head.next; let odd = oddHead, even = e原创 2021-11-02 11:17:07 · 84 阅读 · 0 评论 -
LeetCode707 设计链表
LeetCode707 设计链表题目解题题目解题建议使用哨兵节点,如此一来插入和删除可以减少讨论(链表永远不为空),没有使用哨兵节点的方法的代码也贴在下面。// javascriptvar MyLinkedList = function() { this.head = new ListNode(0); // 哨兵节点 this.size = 0;};/** * @param {number} index * @return {number} */MyLi原创 2021-11-01 16:35:30 · 83 阅读 · 0 评论