算法
马航机长
大前端相关技术栈,目前在深圳修福报
展开
-
反转局部链表
leetcode官方头插法基本思路:将局部需要翻转的链表中,每一个元素依次放到需反转链表的头部,完成反转var reverseBetween = function(head, left, right) { // 设置 dummyNode,避免讨论头节点为null的情况 const dummy_node = new ListNode(-1); dummy_node.next = head; let pre = dummy_node; // pre移动到需要反转链表的原创 2021-06-17 14:29:03 · 588 阅读 · 0 评论 -
反转链表(递归与迭代)
迭代(容易理解)var reverseList = function(head) { if(!head || !head.next) return head // base case let cur = head, pre = null, next = null // 定义三个指针:当前、过去、将来 while(cur){ next = cur.next // 先保存下一个 cur.next = pre // 当前节点下一个节点改为前一个节点原创 2021-06-15 10:01:10 · 96 阅读 · 0 评论 -
算法:打开转盘锁(BFS解决多叉树问题)
var openLock = function(deadends, target) { let q = ['0000'] let hasPush = new Set() // 使用set节省空间,数组超时过一次(玄学) let count = 0 hasPush.add('0000') while(q.length>0){ let len = q.length // 记录每一层长度 // 根据长度循环遍历这一层,进行对应操作(套路原创 2021-05-26 19:34:43 · 100 阅读 · 0 评论 -
算法:二叉树的最小深度(2种解法)
DFS递归var minDepth = function(root) { if(!root) return 0 // 一般求深度的终止base // 如果有一个子树为空,那么就是另一个子树的最小深度+自身节点 if(root.left && !root.right){ return minDepth(root.left) + 1 } if(!root.left && root.right){ return m原创 2021-05-20 09:41:27 · 477 阅读 · 1 评论 -
算法:翻转等价二叉树
递归对比子节点是否不相等,利用两个节点都为空的base来终止递归let flipEquiv = function(root1, root2) { // 终止递归base,两个节点都为空 if(!root1 && !root2) return true // 出现一边有值的情况,返回false if((!root1 && root2 ) || (root1 && !root2)) return false // 节点值不相等,返回f原创 2021-05-18 21:20:43 · 130 阅读 · 0 评论 -
区别:满二叉树和完全二叉树
满二叉树名字有满意味着所有节点全部有值最底层所有节点没有子节点完全二叉树定义:若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。白话:除了最底层全部有值,最底层必须从左开始依次有值,中间不能间断...原创 2021-05-14 09:54:23 · 167 阅读 · 0 评论 -
二叉树层序遍历,二维数组打印每一层元素
迭代BFSvar levelOrder = function(root) { if(!root) return [] // 为空base let stack = [root] let res = [] while(stack.length>0){ let count = stack.length // 每层遍历完毕,记录遍历下一层的节点个数 res.push([]) // 初始化下一层的二维数组 for(let i=0原创 2021-05-11 22:04:26 · 250 阅读 · 0 评论 -
JS前序与中序重建二叉树
核心思想:通过前序遍历知道根节点,再到中序遍历中找到根节点,左边就是左子树,右边就是右子树代码中的rootIndex就是根节点序号。同时也代表着左子树宽度为rootIndex,所以左子树中前序遍历数组slice就是从第二个点开始,往后走rootIndex个数,因为尾部是开区间,所以+1。同理右子树的前序遍历数组slice从1+rootIndex开始。中序遍历数组slice同理,因为从0开始所以左子树尾部就是rootIndex,右子树从rootIndex+1开始var buildTree = fu原创 2021-05-10 01:24:32 · 187 阅读 · 0 评论 -
JS对称二叉树(2种解法)
BFS广度优先遍历var isSymmetric = function(root) { if(!root){return true} let stack = [root.left,root.right] let res = true function search(stack){ if(stack.length ===0) return null let left = stack.shift() let right = s原创 2021-05-09 16:57:41 · 236 阅读 · 0 评论 -
二叉树序列化与反序列化(三种解法)
前序遍历比较简单var serialize = function(root) { let str = '' function search(root){ if(!root){return str += '#,'} str+=`${root.val},` search(root.left) search(root.right) } search(root) return str};var dese原创 2021-05-08 14:27:37 · 87 阅读 · 0 评论 -
前端面试算法(一):两数之和——2种解法
文章目录题目一、不费大脑的解法(双重循环)二、认真脸写法(Map或者对象保存Key值)总结题目 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。 你可以按任意顺序返回答案。示例 1:输入:nums = [2,7,11,15], target = 9输出:[0,1]解释:因为 nums[0] + nums[1] == 9原创 2021-04-07 10:29:00 · 643 阅读 · 0 评论