LeetCode
JJYdesu
这个作者很懒,什么都没留下…
展开
-
【LeetCode练习】55.跳跃游戏(中等|JS|贪心)
【LeetCode练习】55.跳跃游戏(中等|JS|贪心)原创 2022-08-05 16:28:59 · 804 阅读 · 1 评论 -
【LeetCode练习】19. 删除链表的倒数第 N 个结点(中等|JS|快慢指针)
【LeetCode练习】19. 删除链表的倒数第 N 个结点(中等|JS|快慢指针)原创 2022-08-02 22:30:03 · 234 阅读 · 0 评论 -
【LeetCode练习】17. 电话号码的字母组合(中等|JS)
【LeetCode练习】17. 电话号码的字母组合(中等|JS)原创 2022-08-01 22:25:59 · 1337 阅读 · 0 评论 -
【LeetCode练习】9. 回文数(简单|JS|双指针)
【LeetCode练习】9. 回文数(简单|JS|双指针)原创 2022-08-01 21:18:43 · 1255 阅读 · 0 评论 -
【LeetCode练习】2. 两数相加(中等|JS)
文章目录一、题目描述二、解题思路三、代码实现一、题目描述二、解题思路刚开始试了把链表数字转为整数,但溢出了,那只能逐位相加了,考虑进位即可三、代码实现1.转为整数(不可行)var addTwoNumbers = function (l1, l2) { let l1num = 0, l2num = 0, l1n = 1, l2n = 1 while (l1 != null) { l1num += l1.val * l1n l1n *= 10原创 2022-03-02 15:38:26 · 739 阅读 · 2 评论 -
【LeetCode练习】剑指 Offer 45. 把数组排成最小的数(中等|JS|排序)
文章目录一、题目描述二、解题思路三、代码实现一、题目描述二、解题思路很简单,两两拼接,如果ab>ba,那么b就放在a前面,确保每次拼接多一位后都是最小的就可以了,js一行搞定。三、代码实现var minNumber = function (nums) { return nums.sort((a, b) => `${a}${b}` - `${b}${a}`).join('')};...原创 2022-03-02 14:09:47 · 309 阅读 · 0 评论 -
【LeetCode练习】剑指 Offer 46. 把数字翻译成字符串(中等|JS|动态规划)
文章目录一、题目描述二、解题思路三、代码实现一、题目描述二、解题思路用dp[i]来表示前i个数有多少种翻译的可能,初始情况下,dp[0]是空字符串,所以是1,dp[1]是前1个数,也就是第一个数,所以也是1,从前i=2数开始(注意这里i=2,在数字字符串中代表前两个数,dp数组比字符串数组多了一位),有以下两种情况:如果第i-1个数和第i-2个数(实际上就是当前看到的那个数字和前一个数字)组合起来大于25,那么此时前i个数的组合可能就和前i-1个数的组合可能数量相同,dp[i] = dp[i-原创 2021-12-08 16:23:50 · 697 阅读 · 0 评论 -
【LeetCode练习】剑指 Offer 62. 圆圈中最后剩下的数字(简单|JS|找规律)
文章目录一、题目描述二、解题思路三、代码实现一、题目描述二、解题思路约瑟夫环问题(好高级),其实找规律就可以了,以题目为例,我们观察最后剩下的数字3在每一轮所处的位置。第一轮:0 1 2 3 4 0 1 2 3 4,删除2,此时3的下标为(0 + 3) % 5 = 3第二轮:3 4 0 1 3 4 0 1,删除0,此时3的下标为(1 + 3) % 4 = 0第三轮:1 3 4 1 3 4,删除4,此时3的下标为(1 + 3) % 3 = 1第四轮:1 3 1 3,删除1,此时3的下标为(0原创 2021-12-08 14:49:57 · 354 阅读 · 0 评论 -
【LeetCode练习】剑指 Offer 26. 树的子结构(中等|JS|递归)
文章目录一、题目描述二、解题思路三、代码实现一、题目描述二、解题思路写在注释里面。三、代码实现var isSubStructure = function (A, B) { if (!B || !A) return false // 如果这次递归传进来的两个根节点相同,那么就从这两个根节点开始,对它们的左右子树对应来判断是否相等 if(A.val == B.val && helper(A.left,B.left) && helpe原创 2021-12-06 20:57:15 · 326 阅读 · 0 评论 -
【LeetCode练习】剑指 Offer 29. 顺时针打印矩阵(简单|JS|矩阵)
文章目录一、题目描述二、解题思路三、代码实现一、题目描述二、解题思路使用四个指针指向上右下左四个方向,每当遍历完一个方向,就往内缩一层,比如上面第一行遍历完了,top指针就+1,进入第二行;此时来到右边第一列,把右边第一列遍历完,右指针就往左边移动一列,代码中就是-1,下指针和左指针同理,最后以结果数组的长度判断是否已经完成所有元素的遍历。三、代码实现var spiralOrder = function (matrix) { if(matrix.length == 0 ) {原创 2021-12-06 19:37:28 · 416 阅读 · 0 评论 -
【LeetCode练习】剑指 Offer 13. 机器人的运动范围(中等|JS|DFS、BFS)
文章目录一、题目描述二、解题思路三、代码实现一、题目描述二、解题思路方法1:深度优先搜索,需要用一个二维数组来保存机器人是否进入过某个坐标[row,col],避免重复计算,先向一个方向搜索到底,再回溯到上一个节点,从这个节点开始沿另一个方向搜索。踩了一个坑:初始化二维数组的方式要注意(看注释)。方法2:广度优先搜索。。。(先鸽着,等学会了再来)三、代码实现方法1:var movingCount = function (m, n, k) { function cal(i) {原创 2021-12-04 15:47:26 · 327 阅读 · 0 评论 -
【LeetCode练习】剑指 Offer 10- I. 斐波那契数列(简单|JS|动态规划)
文章目录一、题目描述二、解题思路三、代码实现一、题目描述二、解题思路方法1:递归不多说,但是会超时。方法2:动态规划也很简单,要注意的是不能只对最终结果取模,要对每一个结果都取模才行(一开始没发现踩坑了)。三、代码实现方法1:var fib = function (n) { if (n == 0) return 0 if (n == 1) return 1 return (fib(n-1) + fib(n-2)) % 1000000007 };方法2:v原创 2021-12-04 14:35:01 · 342 阅读 · 0 评论 -
【LeetCode练习】剑指 Offer 51. 数组中的逆序对(困难|JS|归并排序、递归)
文章目录一、题目描述二、解题思路三、代码实现一、题目描述二、解题思路这里需要在归并排序的基础上进行改进。首先我们知道归并排序是将一个数组不断切分成左右两个数组,在数组内部进行排序后通过递归合并起来。在每个数组内部都有序的前提下,将左右数组同一个位置的数值进行大小比较。以[7,5,6,4]为例,当切分到[7]和[5],[6]和[4]时,每个单独数组内部都已经有序(现在每个数组只有一个数,也算有序),就对两个数组相同位置的值开始进行比较(1)7和5对比,由于都只有一个元素,此时构成了一个逆序对,记录+原创 2021-12-04 14:02:46 · 444 阅读 · 0 评论 -
【LeetCode练习】剑指 Offer 42. 连续子数组的最大和(简单|JS|动态规划)
文章目录一、题目描述二、解题思路三、代码实现一、题目描述二、解题思路这题主要是要将大问题分解成小问题,用一个dp数组来记录在以i位置数字结尾的连续子数组的最大值,如果加上第i个位置的值(<0)之后变小了,则从第i个位置的数字重新开始算作连续子数组,如果加上第i个位置(>0)后dp[i]比dp[i-1]要大,则该计算可以连续下去。在代码中其实无需判断第i个位置的值是否大于0,只需要把两种情况都算上取最大值即可。循环结束后每个以第i个数字结尾的连续子数组的最大值都计算出来后,再取一遍dp最原创 2021-12-04 10:39:20 · 607 阅读 · 0 评论 -
【LeetCode练习】剑指 Offer 11. 旋转数组的最小数字(简单|JS|二分法)
文章目录一、题目描述二、解题思路三、代码实现一、题目描述二、解题思路使用两个指针分别指向左元素和右边元素,计算中间元素下标,当middle>right说明最小元素在右半部分,当middle<right说明在左半部分,当以上两种情况都不是的时候则有可能最小元素就是left或者right本身(因为数组可以重复)。三、代码实现var minArray = function (numbers) { const len = numbers.length let [left, r原创 2021-12-03 15:50:15 · 175 阅读 · 0 评论 -
【LeetCode练习】剑指 Offer 03. 数组中重复的数字(简单|JS|哈希(Set))
【LeetCode练习】剑指 Offer 03. 数组中重复的数字(简单|JS|哈希(Set))文章目录一、题目描述二、解题思路三、代码实现一、题目描述二、解题思路使用哈希,js中Set数据结构,判断set里面有没有当前数字,没有则加入set里面,有则直接返回结果。三、代码实现var findRepeatNumber = function(nums) { const s = new Set() for(const num of nums){ if(s.has(n原创 2021-12-03 14:38:37 · 504 阅读 · 0 评论 -
【LeetCode练习】剑指 Offer 38. 字符串的排列(中等|JS|递归)
【LeetCode练习】剑指 Offer 38. 字符串的排列(中等|JS|递归)文章目录一、题目描述二、解题思路三、代码实现一、题目描述二、解题思路普通的递归实现即可。三、代码实现var permutation = function (s) { if (s.length == 0) return [''] // 递归退出条件 if (s.length == 1) return [s] const res = [] const len = s.lengt原创 2021-12-03 11:22:53 · 180 阅读 · 0 评论 -
【LeetCode练习】剑指 Offer 49. 丑数(中等|JS|动态规划)
一、题目描述二、解题思路根据定义可知,丑数是前面某个丑数*2或3或5,因此定义p2,p3,p5为前面三个丑数的下标,让其各自乘2、3、5,然后选最小的那个。之后将得到这个丑数的下标+1,下一轮计算就不会再得到这个丑数了。三、代码实现var nthUglyNumber = function(n) { let dp = new Array(n).fill(0) let p2=0,p3=0,p5=0 dp[0] = 1 for(let i=1;i<=n;i++){原创 2021-07-30 22:09:55 · 138 阅读 · 0 评论 -
【LeetCode练习】剑指 Offer 32 - II. 从上到下打印二叉树 II(简单|JS|层序遍历)
文章目录一、题目描述二、解题思路三、代码实现一、题目描述二、解题思路层序遍历。有多少层,res数组就有多长,遍历新的一层就要在对应res的位置初始化空数组,按层序遍历的顺序把节点值push进去。三、代码实现var levelOrder = function(root) { let res = [] function bfs(root,depth){ if(root != null){ if(!res[depth]){原创 2021-07-30 19:35:53 · 180 阅读 · 0 评论 -
【LeetCode练习】剑指 Offer 39. 数组中出现次数超过一半的数字(简单|JS|摩尔投票)
文章目录一、题目描述二、解题思路三、代码实现一、题目描述二、解题思路自己一开始想到的思路很简单,利用到hasOwnProperty这个函数。高级的思路是摩尔投票,即用下一个数抵消上一个数出现的次数,当抵消到为0,则上一个数不是最大的数(不可能超过数组长度的一半),因此把下一个数当做是最大的数,以此类推。三、代码实现自己的思路var majorityElement = function(nums) { const len = nums.length / 2 let obj = {原创 2021-07-26 15:49:04 · 171 阅读 · 0 评论 -
【LeetCode练习】剑指 Offer 68 - II. 二叉树的最近公共祖先(简单|JS|递归)
文章目录一、题目描述二、解题思路三、代码实现一、题目描述二、解题思路两种情况:p、q均不是最近公共祖先p、q其中一个是另一个的祖先因此通过递归由底至上寻找,记录根节点的左右子树是否都有p和q,若是,则该根节点就是最近的公共祖先。或者根节点是p或q时,该根节点的左右子树是否有另外的节点,若是,则该根节点是最近公共祖先。三、代码实现var lowestCommonAncestor = function(root, p, q) { let res const dfs = (r原创 2021-07-25 17:14:00 · 197 阅读 · 1 评论 -
【LeetCode练习】剑指 Offer 35. 复杂链表的复制(中等|JS)
文章目录一、题目描述二、解题思路三、代码实现一、题目描述二、解题思路首先是用Map数据结构创建一个原节点与原节点的值的对应关系,用map的原因是它的key值可以是任何类型,而object只能是简单类型。随后再次遍历原链表,将next和random也复制进去即可完成。三、代码实现var copyRandomList = function(head) { if(!head) return null let m = new Map() let node = head w原创 2021-07-23 11:16:14 · 80 阅读 · 0 评论 -
【LeetCode练习】剑指 Offer 57 - II. 和为s的连续正数序列(简单|JS|滑动窗口)
文章目录一、题目描述二、解题思路三、代码实现一、题目描述二、解题思路滑动窗口:先定义一个按数值顺序排列的原数组,再定义两个指针l=1和r=2,根据sum = ((l+r)*(r-l+1))/2计算当前和,按照以下规则来选择符合条件的数组sum==target:把结果push进结果数组sum<target:r+1sum>target:l+1这样以两个指针作为一个窗口在原数组上滑动,选择合适的片段提取出来push到结果数组即可。三、代码实现var findContinuous原创 2021-01-30 22:31:42 · 64 阅读 · 0 评论 -
【LeetCode练习】剑指 Offer 56 - I. 数组中数字出现的次数(中等|JS|位运算)
文章目录一、题目描述二、解题思路三、代码实现一、题目描述二、解题思路利用语言的一些函数来实现,比较简单位运算:太难了,想了半天才想明白= =截取一下大佬的方法~三、代码实现方法1:var singleNumbers = function(nums) { let res = [] for(let num of nums){ if(res.indexOf(num)==-1) res.push(num) else res.splice(res原创 2021-01-27 22:45:31 · 202 阅读 · 0 评论 -
【LeetCode练习】剑指 Offer 15. 二进制中1的个数(简单|JS|位运算)
文章目录一、题目描述二、解题思路三、代码实现一、题目描述二、解题思路n和n-1与运算,每次运算都能把n最右边的1变成0,直到n为0停止。(妙蛙种子都没你妙!)正则,一开始是先想到正则的,但还不会用,以后学了再补~三、代码实现var hammingWeight = function(n) { let res = 0 while(n){ n = n&(n-1) res++ } return res};...原创 2021-01-25 21:18:51 · 169 阅读 · 0 评论 -
【LeetCode练习】剑指 Offer 47. 礼物的最大价值(中等|JS|动态规划)
文章目录一、题目描述二、解题思路三、代码实现一、题目描述二、解题思路动态规划,思路与机器人路线规划类似,只是边界条件不能单纯设定一个值,要先通过两个循环算出边界条件的值再往后面计算。当然,直接在原数组上操作可以节省空间。三、代码实现var maxValue = function(grid) { const m = grid.length const n = grid[0].length const dp = new Array(grid.length) for(l原创 2021-01-24 22:34:17 · 144 阅读 · 0 评论 -
【LeetCode练习】62. 不同路径(中等|JS|动态规划)
文章目录一、题目描述二、解题思路三、代码实现一、题目描述二、解题思路动态规划分四步走:确定子问题:机器人在第[i][j]的位置都是从[i-1][j]或者[i][j-1]位置走过来的。0确定初始状态:f[0][0] = 1。0确定边界状态:当i=0或j=0,只有一种方式走过去,此时f[i][j]=1转移方程:f[i][j]=f[i-1][j]+f[i]f[j-1]计算顺序:从第0行计算到第m-1行111111112345671361原创 2020-12-29 20:07:41 · 227 阅读 · 0 评论 -
【LeetCode练习】剑指 Offer 14- I. 剪绳子(中等|JS|动态规划)
文章目录一、题目描述二、解题思路三、代码实现一、题目描述二、解题思路动态规划:用dp[i]代表绳子长度为i时所能得到的最大乘积,用j表示将绳子切出长度为j的一段绳子,剩下的长度则为i-j,因为dp[i-j]*dp[j]和(i-j)*j的大小不确定,因此每一次的内循环都要找出大的一方并存入对应的dp[i]中。三、代码实现var cuttingRope = function(n) { let dp = new Array(n+1).fill(1) for(let i=3;i<n原创 2021-01-24 00:19:57 · 93 阅读 · 0 评论 -
【LeetCode练习】剑指 Offer 04. 二维数组中的查找(中等|JS)
文章目录一、题目描述二、解题思路三、代码实现一、题目描述二、解题思路对矩阵每一行使用一次indexOf,若不为-1,则直接返回true,若遍历到最后一行都没有找到,则返回false。方法1没用利用到矩阵有序排列的特性,由于每一行从左到右和每一列从上到下是递增的,因此可以从右上角的数开始判断,有三种情况:1)目标数字与当前数字相等,直接返回。 2)目标数字大于当前数字,则往下一行查找。3)目标数字小与当前数字,则往前一列查找。三、代码实现var findNumberIn2DArray原创 2021-01-20 17:42:25 · 170 阅读 · 0 评论 -
【LeetCode练习】剑指 Offer 07. 重建二叉树(中等|JS|分治法)
文章目录一、题目描述二、解题思路三、代码实现一、题目描述二、解题思路分治法,前序遍历数组的第一个点必然是根节点,找出根节点后,在中序遍历中,根节点左边的元素都是左子树的节点,右边元素则都是右子树节点,以根节点为切分点进行分割递归即可建立该二叉树。三、代码实现重点是要记录index,代表根节点左子树有多少个节点,因为前序遍历是对左子树遍历完再遍历右子树,因此可以根据index的值在preorder中切分出左子树对应的前序遍历数组。var buildTree = function(preo原创 2021-01-22 23:03:24 · 98 阅读 · 0 评论 -
【LeetCode练习】322. 零钱兑换(中等|JS|动态规划)
文章目录一、题目描述二、解题思路三、代码实现一、题目描述二、解题思路首先是分治的思想,将大问题转化为小的问题,而在这个过程中,如果用递归,则会产生大量的重复运算,时间复杂度很高。因此用动态规划的思想,找出每一个问题的最优子结构,然后在计算最终问题的时候得出来的也就是最优结构了。总而言之,动态规划就是为了解决小问题被重复计算得问题。举个例子:又1,2,5面值的硬币,组合出5的面值。首先来看看下图:dp[i]数组用来保存到达第i个值所需要的硬币数量,可以看到如果用普通的递归,会重复计算很多的原创 2020-12-29 19:11:04 · 318 阅读 · 0 评论 -
【LeetCode每日一练】48. 旋转图像(中等|JS)
文章目录一、题目描述二、解题思路三、代码实现一、题目描述二、解题思路将数组沿副对角线交换,然后遍历将其反转。三、代码实现方法1:var rotate = function(matrix) { const l = matrix.length for(let i=0;i<l;i++){ for(let j=i;j<l;j++){ [matrix[i][j],matrix[j][i]] = [matrix[j][i],matri原创 2020-12-19 18:09:06 · 135 阅读 · 1 评论 -
【LeetCode每日一练】1688. 比赛中的配对次数(简单|JS)
文章目录一、题目描述二、解题思路三、代码实现一、题目描述二、解题思路题目已经说了方法了。有n个队伍,只有1个冠军,也就是要淘汰n-1个队伍,每场比赛淘汰一个队伍,需要进行n-1场比赛,所以。。。(不讲武德法)三、代码实现方法1:var numberOfMatches = function(n) { let res = 0 while(n!=1){ if(n%2 == 0){ n = n/2 res += n原创 2020-12-18 19:46:14 · 172 阅读 · 1 评论 -
剑指 Offer 56 - II. 数组中数字出现的次数 II(中等|JS|Map)
文章目录一、题目描述二、解题思路三、代码实现一、题目描述二、解题思路遍历每个元素,用map记录出现的次数,达到3次时将其从map中删除,最后剩下的就是只出现一次的数字,将其展开成数组后取出来。三、代码实现var singleNumber = function(nums) { let m = new Map() for(let num of nums){ if(m.has(num)){ let temp = m.get(num) + 1原创 2020-12-17 16:38:59 · 111 阅读 · 0 评论 -
【LeetCode每日一练】1614. 括号的最大嵌套深度(简单|JS)
文章目录一、题目描述二、解题思路三、代码实现一、题目描述二、解题思路用一个变量A记录连续遇到左括号数,并将其作为深度用变量B记录下来,每当遇到右括号时候,将A变量减一,而变量B依然保持为最大值。三、代码实现var maxDepth = function(s) { let l=0,count=0 for(let i=0;i<s.length;i++){ if(s[i]=='('){ l++ } else if(s[i]原创 2020-12-16 18:38:40 · 494 阅读 · 0 评论 -
【LeetCode每日一练】1290. 二进制链表转整数(简单|JS)
文章目录一、题目描述二、解题思路三、代码实现一、题目描述二、解题思路二进制每增加一位,当前十进制就翻倍,在加上增加的那一位的十进制数。先把head取出来转为字符串,再用parseInt()将二进制解析为十进制整数。三、代码实现方法1:var getDecimalValue = function(head) { let node = head let res = 0 while(node){ res = res*2+node.val原创 2020-12-15 16:16:17 · 120 阅读 · 0 评论 -
【LeetCode每日一练】49. 字母异位词分组(中等|JS|质数的运用)
文章目录一、题目描述二、解题思路三、代码实现一、题目描述二、解题思路使用哈希,对每一个词的字母排序,然后用ES6的map结构存储,然后再取出来合成结果。质数法:利用质数的特性,质数不同,乘积不同;质数相同,乘积相同,这里字符顺序不同,但如果把每个字母对应一个质数,那么只要它们乘积相同,那么就是字母异位词。这样的话就可以少一个sort的时间复杂度。三、代码实现方法1:var groupAnagrams = function(strs) { const len = strs.leng原创 2020-12-14 20:33:45 · 101 阅读 · 0 评论 -
【LeetCode每日一练】217. 存在重复元素(简单|JS)
文章目录一、题目描述二、解题思路三、代码实现一、题目描述二、解题思路这题非常简单(其实是想摸一下鱼 ),使用哈希,Javascript自带Set数据结构。三、代码实现var containsDuplicate = function(nums) { return new Set(nums).size != nums.length};...原创 2020-12-13 21:29:28 · 75 阅读 · 0 评论 -
【LeetCode每日一练】1313. 解压缩编码列表(简单|JS|快慢指针)
文章目录一、题目描述二、解题思路三、代码实现一、题目描述二、解题思路循环一次,根据nums[i]和nums[i+1]创建新的数组,再把这个数组concat到结果数组中,但leetcode上提交这个代码会显示内部错误???!(已发现问题,文末说明)快慢指针:其实和第一种思路其实差不多,但为什么这个就能提交???!三、代码实现方法1:var decompressRLElist = function(nums) { const len = nums.length let res原创 2020-12-12 21:57:18 · 95 阅读 · 0 评论 -
【LeetCode每日一练】513. 找树左下角的值(中等|JS|层序遍历)
文章目录一、题目描述二、解题思路三、代码实现一、题目描述二、解题思路层序遍历:要注意的是往临时数组push节点的顺序很重要,因为我们用while循环来实现层序遍历,所以必定是最后一次循环才输出这个值,因此先往临时数组插入右子树根节点,再插入左子树根节点,然后再从数组第一个位置取出来往下继续循环,这样每次都是从右往左判断,最后一个自然就是底层的最左节点了。三、代码实现var findBottomLeftValue = function(root) { let list = [] l原创 2020-12-11 14:23:29 · 200 阅读 · 0 评论