剑指 offer
CelineCoding
Keep moving, stay kind.
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
剑指 offer 63. 股票的最大利润 -- 动态规划
题目描述题目分析1. 状态定义 dp[i]表示以i结尾的子数组的最大利润;2. 状态转移前 i 日的最大利润dp[i],等于前 i - 1 日的最大利润dp[i-1]和最后一日卖出的最大利润prices[i] - min 取最大值,min代表在价格最低时购入。即dp[i] = Math.max(dp[i-1],prices[i] - min)3. 初始化设置dp[0] = 0,首日利润为04. 返回值return dp[i-1]Code partvar maxProfit = f原创 2022-03-31 15:02:19 · 291 阅读 · 0 评论 -
剑指 offer14-I. 剪绳子 -- 动态规划 js版
js版动态规划解决剪绳子问题。原创 2022-03-11 18:17:17 · 298 阅读 · 0 评论 -
剑指 offer53-II. 0~n-1中缺失的数字 -- 二分查找
看到递增排序用二分法原创 2022-03-10 22:33:14 · 343 阅读 · 0 评论 -
剑指 offer53-I. 在排序数组中查找数字 -- 二分查找
二分查找和哈希表,两种方法解决此题。原创 2022-03-09 21:24:56 · 190 阅读 · 0 评论 -
剑指 offer11. 旋转数组的最小数字 -- 二分查找
二分查找的思想是:从数组的中间位置开始,如果中间元素正好是目标元素,则结束搜索;如果目标值大于或小于中间元素,则在大于或小于中间元素的那一半数组中搜索;重复1、2步;若未找到,return -1;二分查找用在有序数组中。二分查找的使用场景:查找一个数字;统计某个数字出现的次数。分而治之是算法设计中的一种方法。它将一个问题分成多个和原问题相似的小问题,递归解决小问题,再将结果合并以解决原来的问题。分而治之适用的场景:归并、快速、二分和反转二叉树。题目要求题目分析题目中给出的是半有序数组原创 2022-03-09 21:03:15 · 245 阅读 · 0 评论 -
剑指 Offer 62. 圆圈中最后剩下的数字 -- 约瑟夫环
约瑟夫问题是一个著名的问题:N个人围成一圈,第一个人从1开始报数,报M的将被杀掉,下一个人接着从1开始报。如此反复,最后剩下一个,求最后的胜利者。例如只有三个人,把他们叫做A、B、C,他们围成一圈,从A开始报数,假设报2的人被杀掉:从A开始报数,他报1;然后轮到B报数,他报2,被杀掉;接着从C开始新一轮的报数,他报1;接着又到了A,报2,被杀;最后剩下C,C胜利。本题也是这个思路,从0~n-1围城一个圈,从0开始计数,到第m个数字删除,求剩下的数字。...转载 2022-03-09 19:02:05 · 207 阅读 · 0 评论 -
剑指 offer35. 复杂链表的复制 -- JavaScript解法
题目要求思路分析用哈希表表示映射关系:键是原节点,值是复制的节点。第一次遍历链表,复制每个节点和 next 指针,并且保存原节点-〉复制节点的映射关系;第二次遍历,通过哈希表获得节点对应的复制节点,更新random指针;Code partvar copyRandomList = function(head) { let p = head; let map = new Map(); while(p){ map.set(p,new Node(p.val)) //用map来保存原创 2022-03-08 17:39:11 · 636 阅读 · 0 评论 -
剑指 offer27.回文链表 -- JavaScript解法
题目描述思路利用栈后进先出的特性,把链表所有元素入栈,再出栈,与链表节点一一对比,如果是回文链表,对比元素则相同,否则不是回文链表。步骤新建栈;链表所有元素入栈;栈顶元素依次出栈跟链表元素比较;所有元素相同,return true,否则 return false。Code partvar isPalindrome = function(head) { if(!head) return true; const stack = []; let p = head; let原创 2022-03-08 13:05:04 · 939 阅读 · 0 评论 -
剑指 offer22. 链表中倒数第k个节点 -- JavaScript解法
题目要求思路这道题可以用快慢指针的思路。快指针先走k步,之后快慢指针同步走,当快指针到链表最后一个节点时,慢指针正好在倒数第k个节点,因为两个指针始终相差k步,所以,慢–快之间的节点即为相差的k的元素;步骤定义快慢指针p1、p2;快指针先走k步,定义变量记录走的步数,快指针走完k步后,快慢指针同步走,直到快指针走到最后一个节点;注意,最后返回p1即可。Code partvar getKthFromEnd = function(head, k) { let p1 = head,p2原创 2022-03-06 18:13:24 · 548 阅读 · 0 评论 -
剑指 offer03. 数组中重复的数字 -- JavaScript解法
题目描述思路 && Code方法一,对数组进行排序,如果存在重复的元素,元素肯定相邻,从头到位扫描排序后的数组做对比即可。var findRepeatNumber = function(nums) { nums.sort((a,b) => { return a - b; }) for(let i = 0;i < nums.length;i++){ if(nums[i] === nums[i + 1]){ return nums[i]原创 2022-03-05 00:52:41 · 650 阅读 · 0 评论 -
剑指 offer10. 斐波那契数列 -- JavaScript解法
什么是斐波那契数列呢?我们可以理解为它是这样的一个数列:1,1,2,3,5,8…n。该数列前两项相加等于下一项,以此类推。数学公式表示为:f(0) = 0 n = 0f(1) = 1 n = 1f(n) = f(n - 1) + f(n - 2) n>1斐波那契数列可以衍生为一些实际问题,比如爬楼梯问题、兔子繁殖问题等。题目要求解题思路看到公式,我们很快的可以这样写出:function fib(n){ if(n <= 0) return 0; if(n === 1)原创 2022-03-01 16:27:18 · 439 阅读 · 0 评论 -
剑指 offer11. 旋转数组的最小数字 -- JavaScript解法
看到题目还在想,这题还用考吗?直接 array.sort().shift() 不就解决了。其实还要从时间复杂度的方向去考虑问题,另外,直接用api,确定面试官不会把你赶出去吗??其实这道题主要考察二分查找。用二分查找的方法去找到数组中的最小元素。题目描述解题思路解题思路可以参考二分查找,设置low,high表示要搜索的最大最小值的下标,可以先找到数组的中间元素,比较中间元素 mid 和数组末尾元素 high 的大小,根据比较的大小来判断区间值的位置,如果mid 大于 high,说明后部分存在最小值,原创 2022-02-27 22:30:22 · 514 阅读 · 0 评论 -
剑指 offer50. 第一个只出现一次的字符 -- JavaScript解法
这道题相对来说比较简单,主要考察算法中的查找,这道题用哈希表就能解决。哈希表的优点是可以在O(1)的时间内找到某个元素,是效率最高的查找方式;缺点是需要额外的空间去实现哈希表。题目描述解题思路新建map,利用key,value属性;遍历字符串s,查看map中是否包含该字符,若包含,map中存入该字符,设置该值为flag,用来标识该元素已存在;若不存在,map中同样存入该元素,把i当作value设进去。遍历map,返回第一个值不为flag的元素即可。Codingvar firstUniqC原创 2022-02-27 21:15:38 · 464 阅读 · 0 评论 -
剑指 offer09. 用两个栈实现队列 -- JavaScript解法
题目描述解题思路根据题目,可以操作两个“后进先出”的栈,实现一个“先进先出”的队列CQueue。思路:1、假设把a,b,c插入队列,可以把新进来的元素先push进栈1,得到[a,b,c],c位于栈顶;2、删除元素时,由于先进入队列的元素,先被压入stack1的底端,经过弹出和押入操作后,位于stack2的顶端,可以直接弹出。如,abc进入栈1后,stack1 = [a,b,c],删除元素时,理应先删除a,但栈是后进先出,所以栈2利用起来了,把元素从栈1pop出去再push进栈2,得到[c,b,原创 2022-02-26 00:21:31 · 433 阅读 · 0 评论 -
剑指 offer28. 对称的二叉树 -- JavaScript解法
题目描述解题思路使用BFS,层层遍历,判断节点是否相等。镜像对称,说明 左子树的左节点等于右子树的右节点,且左子树的右节点等于右子树的左节点。解题步骤root为null,直接返回true;构建checkSame(left,right)方法,传入根节点的左右子树;若左右子树都为null,说明对称,返回true;若左右子树都存在,则需要:root值相等 && 递归左右子树的child(child也需要满足镜像)Codingvar isSymmetric = functi原创 2022-02-25 18:54:37 · 373 阅读 · 0 评论 -
剑指 offer32. 从上到下打印二叉树 -- JavaScript解法
题目描述解题思路按层打印二叉树,考察的是广度优先遍历,也称宽度优先遍历。注意最后输出的是二维数组,需要把每一层的结点放入单独数组,最后push进需要返回的数组。广度优先遍历步骤新建一个队列 queue,把根节点入队;把队头出队并访问 queue.shift();把对头的children挨个入队;重复2,3步,直到队列为空。Codingvar levelOrder = function(root) { if(!root) return [] let queue = [roo原创 2022-02-25 16:37:10 · 496 阅读 · 0 评论 -
剑指 offer33. 二叉搜索树的后续遍历序列 -- JavaScript解法
题目描述解题思路二叉搜索树的特点是,所有左子树比根节点的值小,所有右子树比根节点的值大,左右子树内部同样也是。后序遍历的根节点在最后一位,找到根节点,再利用二叉搜索树的特点则能判断。codingvar verifyPostorder = function(postorder) { if(!postorder) return false; let len = postorder.length; if(len < 2) return true; let flag = 0; /原创 2022-02-24 23:44:51 · 599 阅读 · 0 评论 -
剑指 offer07. 重建二叉树 -- JavaScript解法
题目描述解题思路这道题考查先二叉树的中后序遍历,已知先序、中序,反推树结构。首先需要明白先中后序遍历的顺序;先序:根左右;中序:左根右;后序:左右根;注意:先中后是看的根的位置,根在左为先序,在中为中序,反之为后序,不要弄混了。解题步骤根据先序的第一个节点就是树的根节点;然后在中序遍历的结果中找出根节点的索引;获取左右子树的先序跟中序遍历值进行递归。codingvar buildTree = function(preorder, inorder) { if(!preo原创 2022-02-24 18:04:59 · 311 阅读 · 0 评论 -
剑指 offer34. 二叉树中和为某一值的路径 -- JavaScript解法
题目描述解题思路题目中的关键字,“从根节点到叶子结点”、“求路径总和”,看到第一个关键字想到深度优先遍历,明确这道题考察dfs,dfs注重考察遍历和递归,注意临界条件。DFS coding过程;当root节点走到null的时候,说明该条路径已经遍历完毕;当一条路径遍历完毕之后,我们使用浅拷贝的方式将一条路径拷贝进res最终结果数组中;然后开始返回,核心点,注意每次返回都要将stack数组的最后一个元素清空。coding过程var pathSum = function(root, tar原创 2022-02-24 12:32:46 · 711 阅读 · 0 评论
分享