LeetCode 剑指Offer
容景
这个作者很懒,什么都没留下…
展开
-
LeetCode 剑指 Offer 53 - I. 在排序数组中查找数字 I(二分查找)—— JavaScript
题链接:https://leetcode-cn.com/problems/zai-pai-xu-shu-zu-zhong-cha-zhao-shu-zi-lcof/题描述:解题思路:使用两次二分查找左右边界,数字出现次数即为 right - left - 1。代码实现:/** * @param {number[]} nums * @param {number} target * @return {number} */var search = function(nums,原创 2020-11-29 10:10:05 · 152 阅读 · 0 评论 -
LeetCode 剑指 Offfer 59 - II. 队列的最大值(辅助队列)—— JavaScript
题链接:https://leetcode-cn.com/problems/dui-lie-de-zui-da-zhi-lcof/类似题:栈的最小值(辅助栈)题描述:解题思路:利用 numQueue 保存输入的变量,利用辅助队列 assQueue 维护一个递减队列,队首存放 numQueue 中的最大值。(1)max_value: 如果队列为空,返回 -1,否则返回 assQueue 队首元素。(2)push_back: 当一个新的元素 T 要进入 numQueue 时..原创 2020-11-28 18:33:12 · 156 阅读 · 0 评论 -
LeetCode 剑指 Offer 14- I. 减绳子(动态规划)—— JavaScript
题链接:https://leetcode-cn.com/problems/jian-sheng-zi-lcof/题描述:解题思路:当绳子长度为 2 或 3 时,直接返回 n -1:2 = 1 + 1 = 1 * 1 = 1,3 = 1 + 2 = 1 * 2 = 2。当绳子长度大于等于4时,利用数组 dp 保存当前绳子的最大乘积,即 dp[i] 表示长度为 i 的绳子拆分的最大乘积。代码实现:/** * @param {number} n * @return {num.原创 2020-11-26 00:10:40 · 180 阅读 · 0 评论 -
LeetCode 剑指 Offer 45. 把数组排成最小的数—— JavaScript
题链接:https://leetcode-cn.com/problems/ba-shu-zu-pai-cheng-zui-xiao-de-shu-lcof/题描述:解题思路:对于两个字符串 a 和 b,如果 a + b > b + a,则 b 应该放在 a 前面。例如:a = "3",b = "30",a + b == "330" > b + a == "303",所以在最后拼接的字符串中,b 必然在 a 的前面,利用这一点,我们可以将数组转换为字符串数组后进行排序,最后返回原创 2020-11-24 13:15:37 · 251 阅读 · 2 评论 -
LeetCode 剑指 Offer 41. 数据流中的中位数—— JavaScript
题链接:https://leetcode-cn.com/problems/shu-ju-liu-zhong-de-zhong-wei-shu-lcof/题描述:解题思路:利用数组存储数据并排序。addNum():(1)找出添加的数据在数组中合适的位置(2)插入该数据findMedian():(1)如果数组长度为奇数,中位数等于数组中间的元素(2)如果为偶数,则为中间两个数的平均值代码实现:function(){ } ...原创 2020-11-23 09:59:30 · 195 阅读 · 1 评论 -
LeetCode 剑指 Offer 30. 包含 min 函数的栈(辅助栈)—— JavaScript
题链接:https://leetcode-cn.com/problems/bao-han-minhan-shu-de-zhan-lcof/题描述:解题思路:栈 A 用于正常存储所有元素,栈 B 用于存储最小元素。代码实现原创 2020-11-23 00:08:58 · 247 阅读 · 1 评论 -
LeetCode 剑指 Offer 66. 构建乘积数组—— JavaScript
题链接:https://leetcode-cn.com/problems/gou-jian-cheng-ji-shu-zu-lcof/题描述:解题思路:B[i] 的值为数组 A 中除了下标为 i 的元素的乘积。B[0] = A[1] * A[2] * A[3] * A[4]。分别迭代计算上三角和下三角两部分的乘积即可得出结果。代码实现:/** * @param {number[]} a * @return {number[]} */var constructArr原创 2020-11-21 10:15:32 · 205 阅读 · 1 评论 -
LeetCode 剑指 Offer 47.礼物的最大价值(动态规划)—— JavaScript
题链接:https://leetcode-cn.com/problems/li-wu-de-zui-da-jie-zhi-lcof/题描述:解题思路:每个单元格只能由另一个单元格向右走或者向下走到达,设 f(i, j) 为从棋盘左上角走到当前单元格的累计最大礼物价值。所以 f(i, j) 为 f(i-1, j) 和 f(i, j-1) 中的较大值加上当前单元格的礼物价值 grid[i][j]。对于边界:(1)当 i==0 且 j ==0 时,f(i, j) = grid[i][j原创 2020-11-20 21:14:53 · 232 阅读 · 1 评论 -
LeetCode 172. 计算阶乘 n! 末尾0的个数——JavaScript
题链接:https://leetcode-cn.com/problems/factorial-trailing-zeroes/题描述:思路:因为题目要求 O(log n) 的时间复杂度,所以不能通过计算 n!,然后计算它的末尾0的个数来求解。n! = k * (10^m),k 为不能被10整除的数,m 就是 n! 末尾0的个数。10 = (2 * 5)^m,所以问题就变成了求2和5的指数,因为能被2整除的数比能被5整除的数多,所以我们求出5的指数即可。设 n = 25,从1到25原创 2020-11-14 20:17:04 · 315 阅读 · 0 评论 -
LeetCode 剑指 Offer 68 - II. 二叉树的最近公共祖先(DFS)(Java-树)
题链接:https://leetcode-cn.com/problems/er-cha-shu-de-zui-jin-gong-gong-zu-xian-lcof/题描述:解题思路:利用 DFS,对每个节点进行左右子节点的遍历,利用变量 res 保存最近公共祖先节点,利用变量 flag 记录当前节点的子树是否有 p 或者 q,在遍历完左右子节点后,如果当前节点是 p 或 q 中的一个,也让 flag 记录(因为一个节点也可以是它自己的祖先)。如果 p 和 q 都在该节点的子树中,且 re原创 2020-10-08 11:40:36 · 223 阅读 · 0 评论 -
LeetCode 剑指 Offer 54. 二叉搜索树的第k大节点(DFS)(JavaScript-树)
题链接:https://leetcode-cn.com/problems/er-cha-sou-suo-shu-de-di-kda-jie-dian-lcof/题描述:解题思路:二叉搜索树的中序遍历序列(左根右)是递增序列,所以右根左的遍历序列为递减序列,我们使用一个计数器 step 记录右根左遍历的节点个数,当 step == k 时,当前节点就是第 k 大的节点。当前节点为空或者已找到结果节点,后面的遍历也就没有意义,应直接返回。代码实现:/** * Definition f原创 2020-10-07 09:31:02 · 190 阅读 · 0 评论 -
LeetCode 剑指 Offer 27. 二叉树的镜像(层序遍历-BFS)(JavaScript 树)
题链接:https://leetcode-cn.com/problems/er-cha-shu-de-jing-xiang-lcof/题描述:解题思路:第一种方法:层序遍历树,将每个节点的左右子节点读出来并变成另一棵树的子节点。最后返回新树根节点即可。/** * Definition for a binary tree node. * function TreeNode(val) { * this.val = val; * this.left = this.ri原创 2020-10-06 09:46:10 · 172 阅读 · 0 评论 -
LeetCode 剑指 Offer 55 - I. 二叉树的深度 (层序遍历-BFS)(JavaScript 树)
题链接:https://leetcode-cn.com/problems/er-cha-shu-de-shen-du-lcof/题描述:解题思路:关键点:利用队列实现层序遍历,每遍历一层,计数器便 +1,直到遍历完成。算法过程解析:1.特例处理:当根节点为空时,直接返回 0。2.初始化:队列 queue(加入根节点),深度计数器 res = 0。3.循环遍历:当 queue 为空时跳出。3.1:初始化一个空数组 temp,用来存储下一次需要遍历的节点。3.2:将当前原创 2020-10-05 21:03:32 · 157 阅读 · 1 评论 -
LeetCode 剑指 Offer 52. 两个链表的第一个公共节点 (虐狗指针法+朴素可怜法)(JavaScript数据结构-链表)
题链接:https://leetcode-cn.com/problems/liang-ge-lian-biao-de-di-yi-ge-gong-gong-jie-dian-lcof/题描述:解题思路:第一种方法:浪漫指针法使用两个指针 tempA,tempB 分别指向两个链表 headA,headB 的头结点,然后同时分别逐结点遍历,当 tempA 到达链表 headA 的末尾时,重新定位到链表 headB 的头结点,当 tempB 到达链表 headB 的末尾时,重新定位到链表 he原创 2020-10-04 11:15:31 · 211 阅读 · 0 评论 -
LeetCode 剑指Offer 18. 删除链表的节点 (JavaScript数据结构-链表)
题链接:https://leetcode-cn.com/problems/shan-chu-lian-biao-de-jie-dian-lcof/利用双指针求解,第一个指向当前节点,第二个指向当前节点的上一个节点,找到要删除的节点,直接让第二个指针指向此节点的下一个节点即可。因为头节点也有可能被删除,所以要使用一个虚拟节点指向头节点,返回时只返回虚拟节点的下一个节点即可。/** * Definition for singly-linked list. * function ListNode原创 2020-10-03 08:33:10 · 1444 阅读 · 1 评论 -
LeetCode 剑指 Offer 35. 复杂链表的复制 (JavaScript数据结构-链表)
题链接:https://leetcode-cn.com/problems/fu-za-lian-biao-de-fu-zhi-lcof/分三步:(1)复制每一个节点,使得复制后的节点都在当前节点的下一个节点(2)原生链表的节点的指向任意节点,使复制的节点也都指向某一任意节点(3)重新连接节点,把原生节点重新连接起来,把克隆后的节点连接起来写链表的题,尽量把链表结构和迭代过程画出来,可以清晰的看出迭代过程,也更容易找出错误。/** * // Definition for a原创 2020-10-02 23:54:39 · 1161 阅读 · 2 评论 -
LeetCode 剑指 Offer 25. 合并两个排序的链表 (JavaScript 数据结构-链表)
题链接:https://leetcode-cn.com/problems/he-bing-liang-ge-pai-xu-de-lian-biao-lcof/因为两个链表是有序的,所以用两个指针遍历两个链表,然后通过比较大小改变这些节点的指向即可。使用一个头节点简化合并过程。/** * Definition for singly-linked list. * function ListNode(val) { * this.val = val; * this.next原创 2020-10-01 12:57:08 · 371 阅读 · 0 评论 -
LeetCode 剑指 Offer 24. 反转链表 (JavaScript 数据结构-链表)
题链接:https://leetcode-cn.com/problems/fan-zhuan-lian-biao-lcof/快慢指针遍历即可。/** * Definition for singly-linked list. * function ListNode(val) { * this.val = val; * this.next = null; * } *//** * @param {ListNode} head * @return {ListNode}原创 2020-09-30 16:18:34 · 140 阅读 · 0 评论 -
LeetCode 剑指 Offer 06. 从尾到头打印链表 (JavaScript 数据结构-链表)
提链接:https://leetcode-cn.com/problems/cong-wei-dao-tou-da-yin-lian-biao-lcof/submissions/从头节点遍历整个链表,并把节点值存入数组,最后将数组的倒序返回(注意链表长度为0的情况)/** * Definition for singly-linked list. * function ListNode(val) { * this.val = val; * this.next = null;原创 2020-09-29 22:45:32 · 132 阅读 · 0 评论 -
LeetCode 剑指 Offer 22. 链表中倒数第k个节点(JavaScript 数据结构-链表)
题链接:https://leetcode-cn.com/problems/lian-biao-zhong-dao-shu-di-kge-jie-dian-lcof/使用双指针即可。var getKthFromEnd = function(head, k) { let curNode = head; while (k > 1 && curNode.next != null) { curNode = curNode.next原创 2020-09-28 20:33:52 · 134 阅读 · 0 评论 -
LeetCode 剑指Offer 31. 栈的压入、弹出序列 (JavaScript 数据结构-栈)
题链接:https://leetcode-cn.com/problems/zhan-de-ya-ru-dan-chu-xu-lie-lcof/使用一个辅助栈来模拟压入弹出,每次进行压入的操作,就判断栈顶元素是否等于弹出序列的当前元素,等于就将辅助栈中符合弹出序列的元素全部弹出。最后辅助栈为空则弹出序列正确。使用变量popIndex表示弹出序列的当前元素的下标。/** * @param {number[]} pushed * @param {number[]} popped * @原创 2020-09-27 22:28:20 · 160 阅读 · 0 评论 -
LeetCode 剑指Offer 09. 用两个栈实现队列(JavaScript 数据结构-栈)
题目链接:https://leetcode-cn.com/problems/yong-liang-ge-zhan-shi-xian-dui-lie-lcof/思路:如图所示,我们用第一个栈支持插入操作,第二个栈支持删除操作。根据栈先进后出的特性,我们把要插入的整数直接添加到第一个栈,在进行删除操作时,首先检测第二个栈是否为空,如果为空则把第一个栈的所有整数压入第二个栈,执行删除操作直接弹出第二个栈的元素返回即可。 var CQueue = functi原创 2020-09-26 22:49:34 · 209 阅读 · 0 评论 -
LeetCode 剑指Offer 63. 股票的最大利润 (动态规划)
题目链接:https://leetcode-cn.com/problems/gu-piao-de-zui-da-li-run-lcof/使用一个变量维护数组中的最小元素,然后每次拿当前保存的res和在当天卖出所获得的利润作比较,取较大值。/** * @param {number[]} prices * @return {number} */var maxProfit = function(prices) { let minIndex = 0; let原创 2020-09-25 23:14:42 · 210 阅读 · 0 评论 -
LeetCode:剑指 Offer 42.连续子数组的最大和(动态规划)
LeetCode:剑指 Offer 42.连续子数组的最大和https://leetcode-cn.com/problems/lian-xu-zi-shu-zu-de-zui-da-he-lcof/描述:输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。每个元素只有两个选择,要么加入前面元素的连续子数组,要么以自己为起点组成连续子数组。在这个遍历的过程中,保存最大值即可。/** * @param {number[]}原创 2020-09-24 22:51:06 · 1211 阅读 · 0 评论