剑指offer刷题怪
Abner_木木
这个作者很懒,什么都没留下…
展开
-
leetcode 3中等 无重复字符的最长子串
双指针 注意下面的位置 max = Math.max((i-start+1),max) delete是从前往后找 不能忘记添加 set.add(s.charAt(i)) /** * @param {string} s * @return {number} */ var lengthOfLongestSubstring = function(s) { let set = new Set() let max = 0 let len = s.length let s原创 2021-06-22 11:14:15 · 70 阅读 · 0 评论 -
leetcode 2链表数字相加
自己写的很丑通过了。丑的原因是主要下面两块没想到,可以记下来用于链表的初始化和迭代 let head = null, tail = null; if (!head) { head = tail = new ListNode(sum % 10); } else { tail.next = new ListNode(sum % 10); tail = tail.next; var addTwoNumbers =原创 2021-06-21 21:39:51 · 140 阅读 · 1 评论 -
剑指 47礼物的最大价值
遇到“最,遍历,选择”,关键字 ,优先想到动态规划 var maxValue = function(grid) { let dp=[]; dp[0]=[] dp[0][0]=grid[0][0] let m = grid.length let n = grid[0].length for (let i=1;i<m;i++){ dp[i]=[] dp[i][0] = grid[i][0]+dp[i-1.原创 2021-06-17 11:28:43 · 44 阅读 · 0 评论 -
剑指 62二叉树的公共祖先
利用二叉树的性质, var lowestCommonAncestor = function(root, p, q) { //二叉搜索树 if (root==null){ return null } if(p.val<root.val&&q.val<root.val){ return lowestCommonAncestor(root.left,p,q) } else if(p.val>root.原创 2021-06-16 11:00:10 · 49 阅读 · 0 评论 -
剑指 55-2 平衡二叉树
var isBalanced = function(root) { if(!root){return true} return defs(root) !== -1 }; // 计算树的深度 var defs = function(node) { if(!node) { return 0 } // 计算左子树深度 const left = defs(node.left) // 计算右子树深度 const right =原创 2021-06-15 10:58:30 · 57 阅读 · 0 评论 -
剑指 37序列化和反序列化
仍然是广度优先遍历 重构仍然需要队列。 var serialize = function(root) { if(root==null){ return '[]' } let que = [] que.push(root) let res = [] res.push(root.val) while(que.length){ let temp = que.shift() // temp.va原创 2021-06-13 22:35:49 · 120 阅读 · 1 评论 -
剑指 34 返回路径之和为某个值得路径
精髓: 1前序遍历解决很多问题 2 数组结合使用pop()可以使得,数组包含路径(从树的根节点开始往下一直到叶节点所经过的节点形成的一条路径)的元素 var pathSum = function(root, target) { if (root == null) return []; let resArr=[] let resItem=[] let sum = 0 function foo(node,temp){ resItem.push(.原创 2021-06-13 16:54:52 · 40 阅读 · 0 评论 -
剑指 32-3z字形打印二叉树
var levelOrder = function(root) { if (root ==null){ return [] } let res = [] let resItem = [] let stack2 =[root] let stack1 = [] while(stack1.length!==0||stack2.length!==0){ while(stack2.length){原创 2021-06-08 22:18:21 · 75 阅读 · 0 评论 -
剑指 32广度优先遍历二叉树
精髓:构建队列,父弹出后必须将左右子节点push进去,每次遍历队列的头即可。 var levelOrder = function(root) { let res = [] let queue = [] queue.push(root) if(root===null){ return [] } while(queue.length){ let node = queue.shift() //console.log(node原创 2021-06-08 16:21:01 · 41 阅读 · 0 评论 -
剑指offer55 求二叉树的深度
剑指offer55 求二叉树的深度 精髓: 1.知道递归的方式,树的遍历顺序,这里是前序遍历 2.这里的递归没有返回值,只有递没有归。更简单 3.将当前执行函数的值传递给下一次递归的函数 var maxDepth = function(root) { //let res = []; let maxRows =0; function sum(root,rows){ if (root==null) return sum(root.left,rows+1) sum原创 2021-06-08 15:08:20 · 40 阅读 · 0 评论 -
64 1+2+3+...n不能用循环语句和乘法除法以及三元运算符?:
var sumNums = function(n) { return n && n + sumNums(n - 1); };//+ 优先级大于 && console.log(sumNums(5));原创 2021-06-06 12:34:37 · 63 阅读 · 0 评论 -
62 圆圈最后的数字
用数组代替循环链表 0 1 2 3 4 m=3 res = 3 依次删除 2 0 4 1 ,最后为3 精髓 1 m-1若m为3 则删除的第3个数字 ,为当前位置+2,当前位置start是第一个数字。 2 start = (start+(m-1))%arr.length function foo(n,m) { let arr = []; for (let i=0;i<n;i++){ arr.push(i); } let sta原创 2021-06-06 12:41:03 · 72 阅读 · 0 评论