
前端算法
谢去非
我挂过的面试,比你面过的公司还要多!
展开
-
对于冒泡排序及冒泡排序的优化的一点理解
对于冒泡排序及冒泡排序的优化的一点理解冒泡排序的一点心得优化冒泡排序外循环优化:内循环优化:function bubbleSort(arr) { // 外层循环控制比较的轮数 for(let i=0; i<arr.length-1; i++){ // 内层循环控制比较的次数 for(let j=0; j<arr.length-1-i; j++){原创 2021-03-10 10:06:39 · 118 阅读 · 0 评论 -
leetcode 222. 完全二叉树的节点个数 JavaScript 解决
leetcode 222. 完全二叉树的节点个数 JavaScript 解决问题描述代码问题描述给你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。代码方案一:不讲码德版本 时间复杂度为O(n)var countNodes = function(root) { if(!root原创 2021-01-19 14:18:20 · 322 阅读 · 2 评论 -
leetcode 101. 对称二叉树难度简单 JavaScript解决
leetcode 101. 对称二叉树难度简单 JavaScript解决题目描述代码题目描述给定一个二叉树,检查它是否是镜像对称的。例如,二叉树 [1,2,2,3,4,4,3] 是对称的。1/ 2 2/ \ / 3 4 4 3但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:1/ 2 2\ 3 3代码var isSymmetric = function(root) { if(!root) return true; //原创 2021-01-18 21:33:26 · 113 阅读 · 0 评论 -
leetcode 100. 相同的树 JavaScript解决
leetcode 100. 相同的树 JavaScript解决问题描述代码问题描述给定两个二叉树,编写一个函数来检验它们是否相同。如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。示例 1:输入: 1 1/ \ / `在这里插入代码片`2 3 2 3 [1,2,3], [1,2,3]输出: true代码var isSameTree = function(p, q) { if(!p &&a原创 2021-01-18 20:26:01 · 124 阅读 · 0 评论 -
leetcode 226. 翻转二叉树 JavaScript解决
leetcode 226. 翻转二叉树 JavaScript解决题目描述代码题目描述翻转一棵二叉树。示例:输入:4/ 2 7/ \ / 1 3 6 9输出:4/ 7 2/ \ / 9 6 3 1代码var invertTree = function(root) { if(!root) return null; invertTree(root.left); invertTree(root.right);原创 2021-01-18 20:14:46 · 101 阅读 · 0 评论 -
leetcode 674. 最长连续递增序列 JavaScript 实现
leetcode 674. 最长连续递增序列 JavaScript 实现题目描述代码for循环解决题目描述给定一个未经排序的整数数组,找到最长且 连续递增的子序列,并返回该序列的长度。连续递增的子序列 可以由两个下标 l 和 r(l < r)确定,如果对于每个 l <= i < r,都有 nums[i] < nums[i + 1] ,那么子序列 [nums[l], nums[l + 1], …, nums[r - 1], nums[r]] 就是连续递增子序列。示例 1:输原创 2021-01-12 23:43:06 · 456 阅读 · 0 评论 -
leetcode 704. 二分查找 JavaScript 解决
leetcode 704. 二分查找 JavaScript 解决问题描述代码问题描述给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。代码var search = function(nums, target) { let left = 0, right = nums.length - 1, mid; while(left <= right) {原创 2021-01-11 14:33:55 · 134 阅读 · 0 评论 -
leetcode 141. 环形链表 JavaScript 解决
leetcode 141. 环形链表 JavaScript 解决题目描述代码题目描述给定一个链表,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。如果链表中存在环,则返回 true 。 否则,返回 false 。代码function h原创 2021-01-11 14:31:59 · 86 阅读 · 0 评论 -
leetcode 279. 完全平方数
leetcode 279. 完全平方数问题描述题解问题描述给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, …)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。题解var numSquares = function(n) { let dp = new Array(n+1).fill(0) // 这里必须要初始化,没有数据无法比较 for(let i=1; i<=n; i++) { dp[i] = i for (le原创 2020-12-28 00:14:34 · 114 阅读 · 0 评论 -
剑指 Offer 35. 复杂链表的复制 JavaScript 实现
剑指 Offer 35. 复杂链表的复制 JavaScript 实现问题描述代码问题描述请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。输入:head = [[7,null],[13,0],[11,4],[10,2],[1,0]]输出:[[7,null],[13,0],[11,4],[10,2],[1,0]]代码var copyRandomList = f原创 2020-11-30 00:06:53 · 181 阅读 · 0 评论 -
剑指 Offer 34. 二叉树中和为某一值的路径 JavaScript 实现
剑指 Offer 34. 二叉树中和为某一值的路径 JavaScript 实现一级目录代码一级目录输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶节点所经过的节点形成一条路径。示例:给定如下二叉树,以及目标和 sum = 22, 5 / \ 4 8 / / \ 11 13 4 / \ / \ 7 2 5 1返回:[原创 2020-11-28 23:43:44 · 114 阅读 · 0 评论 -
剑指 Offer 33. 二叉搜索树的后序遍历序列 JavaScript 实现
剑指 Offer 33. 二叉搜索树的后序遍历序列 JavaScript 实现问题描述代码问题描述输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。参考以下这颗二叉搜索树:5/ 2 6/ 1 3示例 1:输入: [1,6,3,2,5]输出: false示例 2:输入: [1,3,2,6,5]输出: true代码var verifyPostorder = function(原创 2020-11-28 23:06:14 · 133 阅读 · 0 评论 -
剑指 Offer 32 - III. 从上到下打印二叉树 III JavaScript 实现
剑指 Offer 32 - III. 从上到下打印二叉树 III JavaScript 实现问题描述代码问题描述请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。例如:给定二叉树: [3,9,20,null,null,15,7],3/ 9 20/ 15 7返回其层次遍历结果:[[3],[20,9],[15,7]]代码var levelOrder = function原创 2020-11-26 23:29:05 · 107 阅读 · 0 评论 -
剑指 Offer 32 - II. 从上到下打印二叉树 II JavaScript 实现
剑指 Offer 32 - II. 从上到下打印二叉树 II JavaScript 实现问题描述代码问题描述从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。例如:给定二叉树: [3,9,20,null,null,15,7],3/ 9 20/ 15 7返回其层次遍历结果:[[3],[9,20],[15,7]]代码var levelOrder = function(root) { if (!root) return [];原创 2020-11-24 23:39:02 · 164 阅读 · 0 评论 -
剑指 Offer 32 - I. 从上到下打印二叉树 JavaScript实现
剑指 Offer 32 - I. 从上到下打印二叉树 JavaScript实现问题描述代码问题描述从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。例如:给定二叉树: [3,9,20,null,null,15,7],3/ 9 20/ 15 7返回:[3,9,20,15,7]代码定义一个数组,和一个队列,队列里存根节点,从队列头把根节点取出并将其值存入数组时,再将根节点的左右子节点也入队,持续循环,直到队列为空。var levelOrder = funct原创 2020-11-24 23:02:39 · 143 阅读 · 0 评论 -
剑指 Offer 31. 栈的压入、弹出序列 JavaScript实现
剑指 Offer 31. 栈的压入、弹出序列 JavaScript实现问题描述代码问题描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列,但 {4,3,5,1,2} 就不可能是该压栈序列的弹出序列。示例 1:输入:pushed = [1,2,3,4,5], popped = [4,5,3,2,1]输出:true解释:原创 2020-11-14 23:42:56 · 83 阅读 · 0 评论 -
剑指 Offer 29. 顺时针打印矩阵 JavaScript实现
剑指 Offer 29. 顺时针打印矩阵 JavaScript实现问题描述代码问题描述输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。示例 1:输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]输出:[1,2,3,6,9,8,7,4,5]示例 2:输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]输出:[1,2,3,4,8,12,11,10,9,5,6,7]代码var spiralOrder = functi原创 2020-11-14 22:58:31 · 258 阅读 · 0 评论 -
剑指 Offer 28. 对称的二叉树
剑指 Offer 28. 对称的二叉树问题描述代码问题描述请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。例如,二叉树 [1,2,2,3,4,4,3] 是对称的。1/ 2 2/ \ / 3 4 4 3但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:1/ 2 2\ 3 3代码对称二叉树:当前节点值相等,且左子树和右子树是对称的状态。var isSymmetric = functio原创 2020-11-14 21:42:29 · 99 阅读 · 0 评论 -
剑指 Offer 26. 树的子结构 JavaScript实现
剑指 Offer 26. 树的子结构 JavaScript问题描述代码问题描述输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)B是A的子结构, 即 A中有出现和B相同的结构和节点值。例如:给定的树 A:3/ 4 5/ 1 2给定的树 B:4/1返回 true,因为 B 与 A 的一个子树拥有相同的结构和节点值示例 1:输入:A = [1,2,3], B = [3,1]输出:false示例 2:输入:A = [3,4,5,1,2]原创 2020-11-12 22:49:57 · 136 阅读 · 0 评论 -
剑指 Offer 25. 合并两个排序的链表 JavaScript实现
剑指 Offer 25. 合并两个排序的链表 JavaScript实现问题描述代码问题描述输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。示例1:输入:1->2->4, 1->3->4输出:1->1->2->3->4->4代码var mergeTwoLists = function(l1, l2) { let dummy = new ListNode(0); let cur = dummy;原创 2020-11-11 23:51:09 · 224 阅读 · 0 评论 -
图解剑指 Offer 22. 链表中倒数第k个节点 JavaScript 实现
剑指 Offer 22. 链表中倒数第k个节点 JavaSCript 实现问题描述代码问题描述输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有6个节点,从头节点开始,它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个节点是值为4的节点。示例:给定一个链表: 1->2->3->4->5, 和 k = 2.返回链表 4->5.代码var getKthFromEnd = fu原创 2020-11-09 23:21:11 · 226 阅读 · 0 评论 -
leetcode 剑指 Offer 18. 删除链表的节点 JavaScript 实现
leetcode 剑指 Offer 18. 删除链表的节点 JavaScript 实现问题描述代码问题描述给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。返回删除后的链表的头节点。示例 1:输入: head = [4,5,1,9], val = 5输出: [4,1,9]解释: 给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9.示例 2:输入: head = [4,5,1,9], val = 1输出: [4,原创 2020-11-07 23:43:08 · 190 阅读 · 0 评论 -
leetcode 237. 删除链表中的节点 JavaScript解决
leetcode 237. 删除链表中的节点 JavaScript解决问题描述代码问题描述请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点。传入函数的唯一参数为 要被删除的节点 。示例 1:输入:head = [4,5,1,9], node = 5输出:[4,1,9]解释:给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9.示例 2:输入:head = [4,5,1,9], node = 1输出:[4,5,9]解释:原创 2020-11-07 23:01:42 · 132 阅读 · 0 评论 -
leetcode 剑指 Offer 17. 打印从1到最大的n位数 JavaScript 实现
leetcode 剑指 Offer 17. 打印从1到最大的n位数 JavaScript 实现问题描述代码问题描述输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。示例 1:输入: n = 1输出: [1,2,3,4,5,6,7,8,9]代码var printNumbers = function(n) { let res = []; let number = 1; for(let i=0; i原创 2020-11-06 23:05:55 · 161 阅读 · 0 评论 -
leetcode 104. 二叉树的最大深度 JavaScript 解决
leetcode 104. 二叉树的最大深度 JavaScript 解决问题描述代码问题描述给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。说明: 叶子节点是指没有子节点的节点。代码var maxDepth = function(root) { if(root == null) return 0; let left = maxDepth(root.left); let right = maxDepth(root.right);原创 2020-11-06 22:29:24 · 148 阅读 · 0 评论 -
leetcode 145. 二叉树的后序遍历 (两种解法)JavaScript解决
leetcode 145. 二叉树的后序遍历 JavaScript解决问题描述代码问题描述给定一个二叉树,返回它的 后序 遍历。代码方案一:var postorderTraversal = function(root) { let res = [],stack = []; while(root){ if(root.left){ stack.push(root); root = root.left; }原创 2020-11-05 23:29:20 · 151 阅读 · 0 评论 -
leetcode 94. 二叉树的中序遍历 JavaScript实现
leetcode 94. 二叉树的中序遍历 JavaScript实现问题描述代码问题描述给定一个二叉树,返回它的中序 遍历。代码思路:从根节点开始,一旦有左节点,就将父节点先入stack栈,直到叶子结点,将叶子结点入res栈,将该叶子结点的父节点出栈,并将父节点入res栈,找其右结点是否存在,不存在则回溯,继续出栈;存在,则将右结点当作新的根节点,重复开始的过程,直到stack栈为空,输出res栈。var inorderTraversal = function(root) { if(!r原创 2020-11-03 23:25:01 · 175 阅读 · 0 评论 -
leetcode 144. 二叉树的前序遍历 JavaScript两种实现方法
leetcode 144. 二叉树的前序遍历 JavaScript实现题目描述代码题目描述给你二叉树的根节点 root ,返回它节点值的 前序 遍历。输入:root = [1,null,2,3]输出:[1,2,3]输入:root = []输出:[]输入:root = [1]输出:[1]代码方案一思路简述:这是一种迭代的方法,首先判断根节点是否为空,为空则返回空数组。定义两个数组,res数组是存放真正的前序排列的,stack数组是暂存结点的。var preorderTraversa原创 2020-11-03 23:08:46 · 280 阅读 · 0 评论 -
leetcode 53. 最大子序和 JavaScript 实现
leetcode 53. 最大子序和 JavaScript 实现题目描述代码题目描述给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。示例:输入: [-2,1,-3,4,-1,2,1,-5,4]输出: 6解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。代码方案一:var maxSubArray = function(nums) { let maxSum = nums[0]; let dp = new Array原创 2020-11-02 12:53:32 · 95 阅读 · 0 评论 -
leetcode 88. 合并两个有序数组 JavaScript 解决
leetcode 88. 合并两个有序数组 JavaScript 解决问题描述代码问题描述给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。说明:初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。示例:输入:nums1 = [1,2,3,0,0,0], m = 3nums2 = [2,5,6],原创 2020-10-27 22:41:56 · 155 阅读 · 0 评论 -
leetcode 75.Sort Colos 详解 JavaScript解决
leetcode 75.Sort Colos图解代码图解代码var sortColors = function(nums) { let zero = -1//nums[0....zero] = 0, zero的初值为-1,是因为要保证初始的nums[0....zero]是无意义的,如果zero=0,则会导致有一个元素等于0,但事实上不一定是第一位就是0 , two = nums.length;//nums[two......n-1] = 2 ,two等于数组长度和上面zero =原创 2020-10-27 21:38:21 · 119 阅读 · 0 评论 -
leetcode 80. 删除排序数组中的重复项 II JavaScript实现
leetcode 80. 删除排序数组中的重复项 II JavaScript实现问题描述代码问题描述给定一个增序排列数组 nums ,你需要在 原地 删除重复出现的元素,使得每个元素最多出现两次,返回移除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。示例 1:输入:nums = [1,1,1,2,2,3]输出:5, nums = [1,1,2,2,3]解释:函数应返回新长度 length = 5, 并且原数组的前五个元素被修改为原创 2020-10-25 23:28:29 · 147 阅读 · 0 评论 -
leetcode 26. 删除排序数组中的重复项 JavaScript实现
leetcode 26. 删除排序数组中的重复项 JavaScript实现问题描述解题思路代码问题描述给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。示例 1:给定数组 nums = [1,1,2],函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。你不需要考虑数组中超出新长度后面的元素。示例 2:给定 num原创 2020-10-24 23:50:26 · 155 阅读 · 0 评论 -
leetcode 27. 移除元素
leetcode 27. 移除元素题目描述代码题目描述给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。示例 1:给定 nums = [3,2,2,3], val = 3,函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。你不需要考虑数组中超出新长度后面的元素。代码v原创 2020-10-23 22:10:07 · 82 阅读 · 0 评论 -
leetcode 283. 移动零
leetcode 283. 移动零问题描述解决思路问题描述给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。示例:输入: [0,1,0,3,12]输出: [1,3,12,0,0]说明:必须在原数组上操作,不能拷贝额外的数组。尽量减少操作次数。解决思路定义一个p指针,初始指向数组的首元素,同时对数组进行遍历,当数组当前元素为0时,i++;当当前的数组元素不为0时,将此时的元素与p指针所指向的元素进行交换。遍历完数组即可。var moveZero原创 2020-10-22 23:31:20 · 68 阅读 · 0 评论 -
leetcode 28. 实现 strStr()JavaScript解决
@[TOC](leetcode 28. 实现 strStr()JavaScript解决)问题描述给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回 -1。代码var strStr = function(haystack, needle) { if(needle === '') return 0; for(let i=0 ; i<haystack.length原创 2020-09-29 23:00:08 · 141 阅读 · 0 评论 -
剑指 Offer 14- I. 剪绳子 JavaScript实现
剑指 Offer 14- I. 剪绳子 JavaScript实现题目描述题目描述给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]…k[m-1] 。请问 k[0]k[1]…*k[m-1] 可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。var cuttingRope = function(n) { var dp = new A原创 2020-09-26 21:56:22 · 2624 阅读 · 0 评论 -
剑指 Offer 13. 机器人的运动范围 JavaScript解决
剑指 Offer 13. 机器人的运动范围 JavaScript解决问题描述代码问题描述地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外),也不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人能够进入方格 [35, 37] ,因为3+5+3+7=18。但它不能进入方格 [35, 38],因为3+5+3+8=19。请问该机器人能够到达多少个格子?示例 1:原创 2020-09-19 23:56:38 · 263 阅读 · 0 评论 -
剑指 Offer 12. 矩阵中的路径 JavaScript实现
剑指 Offer 12. 矩阵中的路径 JavaScript实现问题描述代码问题描述请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一格开始,每一步可以在矩阵中向左、右、上、下移动一格。如果一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子。例如,在下面的3×4的矩阵中包含一条字符串“bfce”的路径(路径中的字母用加粗标出)。[[“a”,“b”,“c”,“e”],[“s”,“f”,“c”,“s”],[“a”,“d”,“e”,“e”]]但矩原创 2020-09-16 20:08:41 · 121 阅读 · 0 评论 -
剑指 Offer 11. 旋转数组的最小数字 JavaScript解决
剑指 Offer 11. 旋转数组的最小数字 JavaScript解决问题描述代码问题描述把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小值为1。示例 1:输入:[3,4,5,1,2]输出:1示例 2:输入:[2,2,2,0,1]输出:0代码var minArray = function(numbers) { for(原创 2020-09-13 23:16:36 · 153 阅读 · 0 评论