随笔分类 - 基础算法题
基础算法题(比较容易忘记的)
摘要:function getMinStr(str) { const countObj = {} for (let i of str) { Reflect.has(countObj, i) ? countObj[i]++ : countObj[i] = 1 } const result = Object.
阅读全文
摘要:题目描述 给定一个长度为n的数组arr,返回arr的最长无重复元素子数组的长度,无重复指的是所有数字都不相同。 子数组是连续的,比如[1,3,5,7,9]的子数组有[1,3],[3,5,7]等等,但是[1,3,7]不是子数组 输入:[2,3,4,5] 返回值:4 说明:[2,3,4,5]是最长子数组
阅读全文
摘要:题目描述 给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。 输入: s = "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。 思路分析 采用滑动窗口的思想,当前windos中某一个属性次数大于1时就需要缩小窗口 代码参考 co
阅读全文
摘要:题目描述 给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。 异位词 指由相同字母重排列形成的字符串(包括相同的字符串)。 输入: s = "cbaebabacd", p = "abc" 输出: [0,6] 解释: 起始索引等于 0
阅读全文
摘要:题目描述 给定字符串s1和s2,判断s2是否存在s1的子串 eg: s2:'acbdefa',s1:'db' return:true 思路分析 定长窗口移动,还是采用滑动窗口的思路去解 窗口的right指针依次向右移动,维护一个window和needs 必须是定长窗口,因此当窗口大小应当等于righ
阅读全文
摘要:BM90 最小覆盖子串 题目要求 思路分析 使用滑动窗口去解决此类问题。 滑动窗口思路: - 初始化window窗口为长度为0 - 不断的将right指针向右移动 当window中包含所有的目标字符时则为初步完成 - 下一步进行优化,将left指针移动,也就是缩小窗口值,left向右移动 - 直到w
阅读全文
摘要:题目描述 全排列,传入数字 输出所有可能出现的情况 思路分析 经典回溯法例题 采用闭包的方式记录总的结果(可以访问外部变量),记录每一层的结果,记录当前的深度,用记事本记录元素是否遍历过 递归退出条件 代码参考 const permute = (nums) => { // 所有的结果 const r
阅读全文
摘要:题目描述 思路分析 第一种方法:二叉搜索树的中序遍历一定是递增的,只需判断中序遍历的数组即可 第二种方法: - 如果当前节点的值小于左区间或者大于右区间,则返回 false。 - 否则,继续分别递归左右儿子节点: - 递归左儿子,并将左儿子的右区间修改为父节点的值; - 递归右儿子,并将右儿子的左区
阅读全文
摘要:题目描述 思路分析 采用递归的方法,对每一个节点做相同的处理,交换节点位置,也就类似于我们交换两个变量的值一样,需要借助一个临时变量。 递归: - 传递过来的节点需要做什么 - 递归退出条件 - 之后如何递归 代码参考 const Mirror = function (root) { if (!ro
阅读全文
摘要:题目描述 已知两颗二叉树,将它们合并成一颗二叉树。合并规则是:都存在的结点,就将结点值加起来,否则空的位置就由另一个树的结点来代替。例如: 两颗二叉树是: tree1 tree2 合并后的树 牛客原题 思路分析 采用递归的方法,因为每一个节点都在做重复的事 思考每次应该做什么 - 接收两个指针,也就
阅读全文
摘要:题目描述 思路分析 使用递归的方法,每次传递镜像的节点进去,compare函数专门用于比对,对不同的条件做不同的处理 代码参考 const isSymmetrical = function (pRoot) { // write code here if (!pRoot) return true co
阅读全文
摘要:原题链接 思路分析 通过给定的返回值我们就可以发现双向链表遍历的结果顺序是中序遍历。那么我们就可以先利用之前中序遍历的方法,获取到每个节点,再遍历每个节点,将它们的指向进行更改即可,需要注意的是要对第一个和最后一个节点做处理 代码参考 // 使用中序遍历获得结果,之后再对每一个节点做处理 funct
阅读全文
摘要:题目描述 思路分析 采用递归的方法,左(右)子树的sum = sum - root.val。 每次都减去当前的root值,如果左子树或者右子树的节点值等于sum,则说明找到了,返回true,否则当root为空时,退出当前递归,说明找不到,返回false 代码参考 // 传递过来的每一个节点,我们都要
阅读全文
摘要:题目描述 思路分析 外部使用一个容器来存储,借助一个临时的栈来存储每一层的节点,之后根绝临时栈不为空的条件来遍历每一层,并将结果存到容器中 代码参考 /* 给定一个二叉树,返回该二叉树的之字形层序遍历, (第一层从左向右,下一层从右向左,一直这样交替) */ const Print = functi
阅读全文
摘要:题目要求 给你二叉树的根节点 root ,返回它节点值的 前序、中序、后序 遍历的结果。 思路分析 主要用递归的知识,思考,如果传递了一个节点过来我们需要做什么。 如果传递过来了一个节点,这个节点可能还包含有左子树右子树,什么时候是递归的终止条件 步骤: 1. 先判断传递过来的节点是否为空,为空则r
阅读全文
摘要:题目要求 思路分析 如果使用js来做的话,js中有一个BigInt类型的变量,使用这个类型可以直接比较大的字符串直接转化为数字,但是这样做只是能够刷题,不能够应付同类型的题,因此我们可以换一种思路。 方法二: 1. 先将两个字符串补齐,补为长度较长的那个字符串,位数不够用0来补,这里我们可以借助js
阅读全文
摘要:题目描述 给定一个每个元素都是升序数组的二维数组和一个target,判断target是否在数组中 返回boolean类型 思路分析 方法一: 遍历每个元素,判断是否相等 方法二:将数组拍平,也就是数组扁平化,之后在判断里面有没有该target 方法三:对每个子数组都是用二分查找法,去判断其中有没有
阅读全文
摘要:题目描述 请实现无重复数字的升序数组的二分查找 给定一个 元素升序的、无重复数字的整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标(下标从 0 开始),否则返回 -1 思路分析 二分查找其实在我们的日常生活中的使用频率是非常高的,
阅读全文
摘要:题目描述 合并 k 个升序的链表并将结果作为一个升序的链表返回其头节点。 思路分析 之前已经完成了两条有序链表的排序,那么对于任意条有序链表的合并我们都可以借助之前的方法。 借助之前的函数,每次传递一条链表进去,最终返回出一条链表 代码参考 /* 借助于之前的合并两条有序链表的函数来完成, 每次传递
阅读全文
摘要:题目描述 思路分析 做这道题我第一反应是用“记事本”,也就是将遍历过的节点存储起来,如果下次再遍历到这个节点,那么也就是环的入口节点。遍历节点,如果是遍历过的,那么就直接返回这个节点,否则就将这个节点存起来。理解起来思路比较容易,做起来也比较快。 后来在参考别人的代码时发现它们用的数学方法,我也不太
阅读全文

浙公网安备 33010602011771号