前端从0加速
文章平均质量分 86
学习找工作需要的硬技能
卢容和
这个作者很懒,什么都没留下…
展开
-
JS:三大算法day4
贪心算法452. 用最少数量的箭引爆气球(复习)435. 无重叠区间 (复习)56. 合并区间 (复习)763.划分字母区间 (中等)134. 加油站(中等)135. 分发糖果(困难)fail860. 柠檬水找零 (简单)406. 根据身高重建队列 (中等)fail回溯算法131. 分割回文串(中等)417. 太平洋大西洋水流问题(中等)93. 复原 IP 地址(中等)78. 子集 (中等)90. 子集 II (中等)491. 递增子序列 (中等)332. 重新安排行程 (困原创 2022-06-09 10:46:31 · 419 阅读 · 0 评论 -
JS:三大算法 day3
63.不同路径 II:网格中的障碍物和空位置分别用 1 和 0 来表示。343.整数拆分(中等)96.不同的二叉搜索树 (中等)动态规划——子序列问题300.最长递增子序列(已做、入门)1143.最长公共子序列 (旧题)1035.不相交的线 (中等)fail674.最长连续递增序列 (简单)718.最长重复子数组 (中等)53.最大子数组和 647.回文子串 (中等)516.最长回文子序列 5.最长回文子串。原创 2022-05-04 00:19:31 · 454 阅读 · 0 评论 -
JS:三大算法 day2
回溯算法77.组合——横向元素唯一、三角遍历216.组合总和 III——横向元素唯一、三角遍历40.组合总和 II——横向元素重复(需去重)、三角遍历39.组合总和 ——横向元素唯一、矩阵遍历47.全排列 II——横向元素重复(需去重)、三角遍历17.电话号码的字母组合贪心算法(重做)376.摆动序列53. 最大子数组和 (简单)122. 买卖股票的最佳时机 II (中等)模拟贪心算法动态规划(情况复杂)55. 跳跃游戏 (中等)原创 2022-04-30 17:38:55 · 1525 阅读 · 0 评论 -
JS:三大算法 day1
回溯、贪心、动态规划的思路是通过大量做题培养的,不是说几天就能掌握,而且题目不会告诉你使用哪个算法。坚持做题。。。回溯——46. 全排列 51.N皇后前序遍历的代码在进入某一个节点之前的那个时间点执行,后序遍历代码在离开某个节点之后的那个时间点执行。 「路径」和「选择」是每个节点的属性def backtrack(路径, 选择列表): if 满足结束条件: result.add(路径) return for 选择 in 选择列表: # 做选择 将该原创 2022-03-03 01:22:18 · 610 阅读 · 0 评论 -
JS:二叉堆 3题、区间问题 7 题
小顶堆其他语言可以用优先队列完成小顶堆的功能,但没有内置函数的JavaScript就要手写一个小顶堆。面试题要用,起码可以复制一个没错的数据结构。如果要求手写小顶堆,我们也可以从理解上记忆。之前写过的 23.合并K个升序链表(困难)JS代码小顶堆(优先队列)有两个主要 API,分别是 insert 插入一个元素和 delMin 删除最小元素。二叉堆可用数组实现,核心是父节点与左右子节点有倍数关系。一步步构建类的数据结构 和 获取节点(索引)(要熟悉JS怎么写类)class minHeap..原创 2022-03-01 22:03:36 · 628 阅读 · 0 评论 -
JS:队列/栈——最长有效括号,平衡括号,后缀表达式
225. 用队列实现栈 (简单)请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作。考点在pop()方法:底层数据结构是先进先出的队列,每次 pop 只能从队头取元素;但是栈是后进先出,pop 要从队尾取元素。解决方法简单粗暴,把队列前面的都取出来再加入队尾,让之前的队尾元素排到队头,这样就可以取出了。/** * @return {number} */MyStack.prototype.pop = function() { let len = thi.原创 2022-02-27 17:46:05 · 841 阅读 · 0 评论 -
JS:二叉搜索树(2)——后序遍历、递归改迭代
手把手带你刷通二叉搜索树(第三期)——如何计算所有合法 BST96. 不同的二叉搜索树 (中等)fail给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。什么方式能够正确地穷举合法 BST 的数量呢?所以如果固定3作为根节点,左子树节点就是{1,2}的组合,右子树就是{4,5}的组合。左子树的组合数和右子树的组合数乘积就是3作为根节点时的 BST 个数。函数的含义为:计算闭区间 [1, n] 组成的 BST原创 2022-02-26 18:30:54 · 748 阅读 · 0 评论 -
JS:二叉搜索树(1)——中序遍历,基础操作
Binary Search Tree简单总结下吧,BST 相关的问题,要么利用 BST 左小右大的特性提升算法效率,要么利用中序遍历的特性满足题目的要求,也就这么些事儿吧。230. 二叉搜索树中第K小的元素给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 个最小元素(从 1 开始计数)。BST 的中序遍历其实就是升序排序的结果var kthSmallest = function(root, k) { let res = 0, rank = 0;原创 2022-02-25 20:59:40 · 1776 阅读 · 0 评论 -
JS:二叉树(4)——刷题,最小深度,公共祖先,最大路径和
100. 相同的树 (简单)给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。因为遍历的函数有返回值,所以递归左右子树时,要用变量去接住。!(p && q) 只要有一个为null ,表达式为truevar isSameTree = function(p, q) { if (p==null && q==null) return true if (!(p &am原创 2022-02-25 00:32:59 · 741 阅读 · 0 评论 -
JS:二叉树(3)——序列化二叉树、查找重复子树
根据题意,思考一个二叉树节点需要做什么,到底用什么遍历顺序就清楚了。297.二叉树的序列化与反序列化652.寻找重复的子树297.二叉树的序列化与反序列化 (困难)你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。所谓的序列化不过就是把结构化的数据「打平」,其实就是在考察二叉树的遍历方式。那么,反序列化过程也是一样,先确定根节点 root,然后遵循前序遍历的规则,递归生成左右子树即可:前序遍历解法:var serialize = function(原创 2022-02-24 13:44:12 · 474 阅读 · 0 评论 -
JS:二叉树(2)——递归操作节点、构造二叉树
手把手带你刷二叉树(第一期)「该做什么」就是让你想清楚写什么代码能够实现题目想要的效果,所谓「什么时候做」,就是让你思考这段代码到底应该写在前序、中序还是后序遍历的代码位置上。我们直接上几道比较有意思,且能体现出递归算法精妙的二叉树题目二叉树题目的一个难点就是,如何把题目的要求细化成每个节点需要做的事情。226. 翻转二叉树给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。这道题目比较简单,关键思路在于我们发现翻转整棵树就是交换每个节点的左右子节点,于是我们把交换左右子节原创 2022-02-23 19:41:52 · 851 阅读 · 1 评论 -
JS:遍历二叉树(1)——两种递归思路
前中后序是遍历二叉树过程中处理每一个节点的三个特殊时间点二叉树的所有问题,就是让你在前中后序位置注入巧妙的代码逻辑,去达到自己的目的。后序位置的代码不仅可以获取参数数据,还可以获取到子树通过函数返回值传递回来的数据。一旦你发现题目和子树有关,那大概率要给函数设置合理的定义和返回值,在后序位置写代码了两种解题思路二叉树题目的递归解法可以分两类思路,第一类是遍历一遍二叉树得出答案,第二类是通过分解问题计算出答案,这两类思路分别对应着 回溯算法核心框架 和 动态规划核心框架。104. 二叉树的最大深度原创 2022-02-23 12:51:35 · 1523 阅读 · 0 评论 -
JS:链表题目(2)——反转链表(递归、迭代)、回文链表
25.K 个⼀组翻转链表83.删除排序链表中的重复元素92.反转链表 II234.回⽂链表206. 反转链表 (简单)给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。var reverseList = function(head) { let p = new ListNode(0), p1 = head; while(p1){ p1 = head.next; head.next = p.next; p.next原创 2022-02-22 14:53:27 · 1675 阅读 · 0 评论 -
JS:链表题目(1)——两数相加、合并链表(小顶堆)
2.两数相加19.删除链表的倒数第 N 个结点21.合并两个有序链表23.合并 K 个升序链表141.环形链表142.环形链表 II160.相交链表876.链表的中间结点25.K 个⼀组翻转链表83.删除排序链表中的重复元素92.反转链表 II234.回⽂链表2. 两数相加 (中等)一次遍历计算完成,需注意:构建空的头结点,不用处理一开始指针指向null的情况执行加法,考虑进位的情况。新链表要记得移动。两个链表不等长读完两个链表后,最后一次进位仍要处理21. 合并原创 2022-02-19 16:34:27 · 647 阅读 · 0 评论 -
JS:二分搜索(3)—— 子序列、信封嵌套、阶乘数的0
35. 搜索插入位置 (简单)给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。请必须使用时间复杂度为 O(log n) 的算法。就是普通的二分搜索,目标值不存在时,返回的是left ,因为结束条件是left = right + 1,结束的前一步分情况:left + 1 = right 或者 left = right;然后在具体每种if else情况下,left的下标都是一下特点。392. 判断子序列 (简单)双指针:v.原创 2022-02-18 03:32:46 · 567 阅读 · 0 评论 -
JS:二分搜索(2)——实际应用
前文总结的二分搜索代码框架仅仅局限于「在有序数组中搜索指定元素」这个基本场景,具体的算法问题没有这么直接,可能你都很难看出这个问题能够用到二分搜索。查找目标值的二分搜索问题中,x就是下标索引,f(x)返回数组下标对应的值,target就是目标值。看完文章,其实是不知道它想怎样的,做完题就深感体会了。875. 爱吃香蕉的珂珂 (中等) fail这里需要绕一下,索引并不是piles这个无序的数组的下标,因为求的是最小速度,所以速度才是索引——自变量x。f(x)是和target一个等级的,targ原创 2022-02-16 16:20:20 · 499 阅读 · 0 评论 -
JS:二分搜索(1)——查找目标值
二分搜索结束后,数组的题目或者技巧就差不多入门了。阅读 算法小抄按照网站的做题路线。二分查找思想就是左右指针,但是二分查找真正的坑根本就不是那个细节问题,而是在于到底要给 mid 加一还是减一,while 里到底用 <= 还是 <。所以要明确「搜索区间」而我的烦恼一直是,二分插入排序时,left还是right才是要插入的地方。防止溢出:int mid = left + (right - left) / 2;对于JavaScript,得到mid带有小数二、寻找左侧边界的二分搜索原创 2022-02-15 23:05:05 · 608 阅读 · 0 评论 -
JS:滑动窗口算法 (下集)
上集的两道题目,分开两集的目的是,尽可能自己手写一遍模板。438. 找到字符串中所有字母异位词 (中等)其实就是在567. 字符串的排列的基础上,找到 S 中所有 T 的排列,返回它们的起始索引。/** * @param {string} s * @param {string} p * @return {number[]} */var findAnagrams = function(s, p) { let need = {}, window = {}; for (let c原创 2022-02-15 17:23:48 · 531 阅读 · 0 评论 -
JS:滑动窗口算法 (上集)
建议先读文章,本文就解决一类最难掌握的双指针技巧:滑动窗口技巧。难度在于各种细节问题,比如:如何向窗口中添加新元素,如何缩小窗口,在窗口滑动的哪个阶段更新结果。原创 2022-02-15 01:32:11 · 962 阅读 · 0 评论 -
JS:数组双指针,优势洗牌,区间交集(fail)
基本的数组双指针的题目大致如下:剩下两题,两题都是思想为主,与双指针沾边。优势洗牌 (中等),fail田忌赛马,打得过就打,打不过就拿自己的垃圾和对方的精锐互换。我原本的思路:是不对nums2排序,遍历nums2,每次都要与nums1逐个比较,而且涉及nums1的删除操作,感觉也行不通。nums2 中元素的顺序不能改变,因为计算结果的顺序依赖 nums2 的顺序,所以不能直接对 nums2 进行排序,而是利用其他数据结构(保存原来索引和值的对象)来辅助。[1,10,4,11]map转成数组[原创 2022-02-11 17:50:29 · 646 阅读 · 0 评论 -
JS:双指针解决数组问题,接雨水
26. 删除有序数组中的重复项 (简单)给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。/** * @param {number[]} nums * @return {number} */var removeDuplicates = function(nums) { let i=0, len=nums.length; f原创 2022-02-11 01:49:53 · 767 阅读 · 0 评论 -
2Sum 3Sum 4Sum 问题
摘自labuladong两数之和 扩展版nums = [1,3,1,2,2,3], target = 4问题一:[1,3] 和 [3,1] 就算重复,通过先排序再双指针可实现结果的按顺序排列。问题二:nums = [1,1,1,2,2,3,3], target = 4[1,3] 肯定会重复出问题的地方在于 sum == target 条件的 if 分支,当给 res 加入一次结果后,lo 和 hi 不应该改变 1 的同时,还应该跳过所有重复的元素: // 记录索引 lo 和 hi原创 2022-02-09 23:48:08 · 395 阅读 · 0 评论 -
二维数组的花式遍历
48. 旋转图像给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。观察图可知办法,怎么将数字5移到目的地,(先行逆序,再对角线对称)网站则先对角线对称,再行逆序,感觉这样难发现。JS的整除运算reverse() 方法将改变原始数组。难点:对角线为对称轴交换元素正对角线,遍历右上三角for (int i = 0; i < n; i++) { for (int j = i; j < n; j++) { swap(m原创 2022-02-08 16:07:17 · 490 阅读 · 0 评论 -
JavaScript刷题——双指针、数组的内置方法
快慢指针141.环形链表给你一个链表的头节点 head ,判断链表中是否有环。因为fast指针一次走两步,注意判断条件while(fast!=null && fast.next!=null)判断是否同一个节点slow == fast142.环形链表 II给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。以前使用python的解析:fast和slow第一次在环内相遇。slow1在头结点开始和slow继续环内移动,第二次在环入口相遇。至于为什么原创 2022-01-10 23:10:12 · 586 阅读 · 0 评论 -
JavaScript刷题——前缀和数组、差分数组
303.区域和检索 - 数组不可变已知一维数组长度,创建数组:const preSum = new Array(nums.length + 1);而我是先赋值第一个元素,再push添加新元素:this.arr = [nums[0]]304.二维区域和检索 - 矩阵不可变创建二维数组:const preSum = new Array(rows)for (let i = 0; i < rows; i++) { preSum[i] = new Array(cols)}560.和为原创 2022-01-10 13:14:18 · 1060 阅读 · 0 评论